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  * 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     void reorderList(ListNode* head) {
12         if(head == NULL || head->next == NULL){
13             return;
14         }
15         
16         
17         
18         ListNode* fast = head;
19         ListNode* slow = head;
20         
21         while(fast->next != NULL && fast->next->next != NULL){
22             fast = fast->next->next;
23             slow = slow->next;
24         }
25         fast = slow->next;
26         slow->next = NULL;
27         
28         fast = ReverseList(fast);
29         
30         slow = head;
31         
32         while(slow){
33             if(fast != NULL){
34                 ListNode* n = slow->next;
35                 slow->next = fast;
36                 ListNode* nn = fast->next;
37                 fast->next = n;
38                 fast = nn;
39                 slow = n;
40             }else{
41                 break;
42             }
43         }
44     }
45     
46     
47     ListNode* ReverseList(ListNode* pHead){
48         ListNode* pReversedHead = NULL;
49         ListNode* pNode = pHead;
50         ListNode* pPrev = NULL;
51         
52         while(pNode != NULL){
53             ListNode* pNext = pNode->next;
54             
55             if(pNext == NULL){
56                 pReversedHead = pNode;
57             }
58             
59             pNode->next = pPrev;
60             pPrev = pNode;
61             pNode = pNext;
62         }
63         return pReversedHead;
64     }
65 };
原文地址:https://www.cnblogs.com/sankexin/p/5867583.html