Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You may not modify the values in the list's nodes, only nodes itself may be changed.
Example 1:
Given 1->2->3->4, reorder it to 1->4->2->3.
Example 2:
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
解题思路:
1.将链表分成两部分,并且前部分与后部分相等或者大1。(快慢指针!!!)
2.将后部分反转。
3.将两部分合在一起。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode* head) {
if(head==NULL||head->next==NULL||head->next->next==NULL)
return ;
ListNode* slow=head;
ListNode* fast=head;
while(fast->next!=NULL) //find mid
{
fast=fast->next;
if(fast->next==NULL) break;
fast=fast->next;
slow=slow->next;
}
ListNode* head2=slow->next;
slow->next=NULL;
ListNode* cur=head2;
ListNode* nex=cur->next;
cur->next=NULL;
while(nex!=NULL)
{
ListNode* tmp=nex->next;
nex->next=cur;
cur=nex;
nex=tmp;
}
head2=cur;
ListNode* left1=head;
ListNode* left2=head->next;
ListNode* right1=cur;
ListNode* right2=cur->next;
while(right1!=NULL)
{
left1->next=right1;
right1->next=left2;
left1=left2;
right1=right2;
if(right2==NULL) break;
left2=left2->next;
right2=right2->next;
}
}
};