143. Reorder List
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-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;
}
}
};