描述
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}.
分析:题目规定要in-place,也就是说只能使用O(1) 的空间。
可以找到中间节点,断开,把后半截单链表reverse 一下,再合并两个单链表。
class Solution3
{
public:
ListNode* deleteDuplicates(ListNode* head)
{
if(head==NULL||head->next==NULL)
return head;
ListNode* cur=head;
ListNode* fast=head,*slow=head;
while(fast->next&&fast->next->next)
{
fast=fast->next->next;
slow=slow->next;
}
ListNode* H1,*H2;
H1=head;H2=slow->next;
slow->next=NULL;
H2=reverse(H2);
return align(H1,H2);
}
private:
ListNode* reverse(ListNode* head)//反转链表
{
if(head==NULL||head->next==NULL)
return head;
ListNode* pre=head->next,*cur=pre->next;
head->next=NULL;
while(cur)
{
pre->next=head;
head=pre;
pre=cur;
cur=cur->next;
}
pre->next=head;
return pre;
}
ListNode* align(ListNode*H1,ListNode*H2)//合并链表
{
ListNode* head=H1;
ListNode* p1=H1->next,*p2=H2->next;
while(p1)
{
H1->next=H2;
H2->next=p1;
H1=p1;
p1=p1->next;
H2=p2;
if(p2)
p2=p2->next;
}
H1->next=H2;
return head;
}
};
void main()
{
ListNode* node1=new ListNode(1);
ListNode* node2=new ListNode(2);
ListNode* node3=new ListNode(3);
ListNode* node4=new ListNode(4);
ListNode* node5=new ListNode(5);
ListNode* node6=new ListNode(6);
ListNode* node7=new ListNode(7);
ListNode* node8=new ListNode(8);
ListNode* node9=new ListNode(9);
ListNode* node10=new ListNode(10);
ListNode* node11=new ListNode(11);
ListNode* node12=new ListNode(12);
node1->next=node2;
node2->next=node3;
node3->next=node4;
node4->next=node5;
node5->next=node6;
node6->next=node7;
node7->next=node8;
node8->next=node9;
node9->next=node10;
node10->next=node11;
//node11->next=node12;
ListNode* head;
head=node1;
Solution3 solution;
head=solution.deleteDuplicates(head);
while(head)
{
cout<<head->val<<' ';
head=head->next;
}
}