leetcode 143. Reorder List

来源:互联网 发布:线切割圆弧编程 编辑:程序博客网 时间:2024/06/18 06:17

143. Reorder List

Given a singly linked list LL0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-2→…

You must do this in-place without altering the nodes' values.

For example,
Given {1,2,3,4}, reorder it to {1,4,2,3}.


(法1)我的思路是每次找最后一个,然后插入到应该的位置,但是这样为o(n^2)。

(法2)还有一个思路是中间分为两节,后一节倒置,然后挨个插入,o(n)。


/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* Reverse2(ListNode* head)    {        if(!head)            return head;        else if(!head->next)            return head;        else        {            ListNode* tail=head;             ListNode* coming=head->next;                      while(coming)            {                tail->next=coming->next;                coming->next=head;                              head=coming;                coming=tail->next;            }            return head;         }        return head;    }        void reorderList(ListNode* head)     {        if(!head)            return;                   ListNode *fast=head;        ListNode *slow=head;               //将链表拆为两节        while(fast && fast->next)        {            fast=fast->next->next;            slow=slow->next;        }        fast=slow->next;        slow->next=NULL;               //转置第二节        fast=Reverse2(fast);               //合并        ListNode *p=fast;        ListNode *q=head;        while(fast && q)        {            p=fast;            fast=fast->next;                      p->next=q->next;             q->next=p;            q=p->next;              }    }};