[leetcode]143. Reorder List

Given a singly linked list LL0→L1→…→Ln-1→Ln,
reorder it to: L0→LnL1→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.找到中间节点。划分为两个链表。(算法总结里有)

2.把后半部分链表反转。(算法总结里有)

3.合并两个链表。(递归)

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* ReverseList(ListNode* head){
12     if(head==NULL||head->next==NULL)
13         return head;
14     ListNode* p=head->next,*q=head,*l=head;
15     while(p->next!=NULL){
16         l=p->next;
17         p->next=q;
18         q=p;
19         p=l;
20     }
21     p->next=q;
22     head->next=NULL;
23     return p;
24 }
25 ListNode* Merge(ListNode* l1,ListNode* l2){
26     if(l1==NULL)
27         return l2;
28     if(l2==NULL){
29         l1->next=NULL;
30         return l1;
31     }
32     ListNode* p=l1,*q=l2;
33     l1=l1->next;
34     l2=l2->next;
35     p->next=q;
36     q->next=Merge(l1,l2);
37     return p;
38 }
39     void reorderList(ListNode* head) {
40         if(head==NULL||head->next==NULL)
41             return;
42         ListNode* p=head,*q=head,*bf=NULL;
43         while(p&&p->next!=NULL){
44             p=p->next->next;
45             bf=q;
46             q=q->next;
47     }
48     bf->next=NULL;
49     q=ReverseList(q);
50     Merge(head,q);
51     return;
52     }
53 };

 

posted @ 2016-07-14 22:46  0giant  阅读(194)  评论(0编辑  收藏  举报