15
15
// ============================================================================
16
16
17
17
#include < iostream>
18
+
18
19
using namespace std ;
20
+
21
+
19
22
/* *
20
23
* Definition for singly-linked list.
21
24
*/
@@ -25,7 +28,6 @@ struct ListNode {
25
28
ListNode (int x) : val(x), next(NULL ) {}
26
29
};
27
30
28
-
29
31
class Solution {
30
32
public:
31
33
void reorderList (ListNode *head) {
@@ -41,28 +43,34 @@ class Solution {
41
43
curNode = curNode->next ;
42
44
}
43
45
44
- int i = 0 , j = vs.size ()- 1 ;
46
+ int i = 0 , j = vs.size () - 1 ;
45
47
while (i < j) {
46
48
vs[i]->next = vs[j];
47
- vs[j]->next = vs[i+ 1 ];
49
+ vs[j]->next = vs[i + 1 ];
48
50
i++, j--;
49
51
}
50
52
vs[i]->next = NULL ;
51
53
}
52
54
53
55
void reorderList2 (ListNode *head) {
54
- if (head == NULL ) return ;
55
- ListNode * slowNode = head, *fastNode = head;
56
- while (fastNode->next != NULL && fastNode->next ->next != NULL ) slowNode = slowNode->next , fastNode = fastNode->next ->next ;
57
- if (slowNode == fastNode) return ;
58
- fastNode = reverse (slowNode->next );
56
+ if (head == NULL || head->next == NULL ) return ;
57
+ ListNode * frontHead, *backHead;
58
+ split (head, frontHead, backHead);
59
+ backHead = reverse (backHead);
60
+ merge (frontHead, backHead);
61
+ }
62
+
63
+ void split (ListNode * head, ListNode *& frontHead, ListNode *& backHead) {
64
+ ListNode * fastNode = head, *slowNode = head;
65
+ for (; fastNode->next != NULL && fastNode->next ->next != NULL ; fastNode = fastNode->next ->next ) slowNode = slowNode->next ;
66
+ backHead = slowNode->next ;
59
67
slowNode->next = NULL ;
60
- head = merge ( head, fastNode) ;
68
+ frontHead = head;
61
69
}
62
70
63
- ListNode * reverse (ListNode * curNode ) {
64
- ListNode * preNode = NULL ;
65
- while (curNode != NULL ) {
71
+ ListNode * reverse (ListNode * head ) {
72
+ ListNode * preNode = NULL , *curNode = head ;
73
+ while (curNode) {
66
74
ListNode * nextNode = curNode->next ;
67
75
curNode->next = preNode;
68
76
preNode = curNode;
@@ -71,21 +79,26 @@ class Solution {
71
79
return preNode;
72
80
}
73
81
74
- ListNode * merge (ListNode * frontNode , ListNode * backNode ) {
75
- ListNode * head = new ListNode (- 1 ), *curNode = head;
76
- while (frontNode != NULL || backNode != NULL ) {
77
- if (frontNode != NULL ) curNode->next = frontNode, frontNode = frontNode ->next , curNode = curNode->next ;
78
- if (backNode != NULL ) curNode->next = backNode, backNode = backNode ->next , curNode = curNode->next ;
82
+ void merge (ListNode * frontHead , ListNode * backHead ) {
83
+ ListNode * head = pushDummy ( NULL ), *curNode = head;
84
+ while (frontHead || backHead ) {
85
+ if (frontHead ) curNode->next = frontHead, frontHead = frontHead ->next , curNode = curNode->next ;
86
+ if (backHead ) curNode->next = backHead, backHead = backHead ->next , curNode = curNode->next ;
79
87
}
88
+ head = popDummy (head);
89
+ }
80
90
81
- return deleteNode (head);
91
+ ListNode * pushDummy (ListNode * head) {
92
+ ListNode * newNode = new ListNode (-1 );
93
+ newNode->next = head;
94
+ return newNode;
82
95
}
83
96
84
- ListNode * deleteNode (ListNode * curNode ) {
85
- ListNode * toDel = curNode ;
86
- curNode = curNode ->next ;
87
- delete toDel ;
88
- return curNode ;
97
+ ListNode * popDummy (ListNode * head ) {
98
+ ListNode * delNode = head ;
99
+ head = head ->next ;
100
+ delete delNode ;
101
+ return head ;
89
102
}
90
103
};
91
104
0 commit comments