思路
1. 将后半段截取下来再倒序, 插入到前半段, 时间复杂度为 o(n)
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 |
#include <iostream> using
namespace std; struct
ListNode { int
val; ListNode *next; ListNode( int
x) : val(x), next(NULL) {} }; class
Solution { public : void
reorderList(ListNode *head) { if (head == NULL) return ; int
size = 0; ListNode *curNode = head; while (curNode) { size++; curNode = curNode->next; } int
step = size - (size >> 1); // pick the larger part ListNode *cursor1 = head, *cursor2 = head; while (--step) cursor2 = cursor2->next; ListNode *tmp = cursor2; if (tmp != NULL) { cursor2 = tmp->next; tmp->next = NULL; } cursor2 = reverseList(cursor2); while (cursor2) { ListNode *tmp = cursor2; cursor2 = cursor2->next; tmp->next = cursor1->next; cursor1->next = tmp; cursor1 = tmp->next; } } ListNode* reverseList(ListNode* head) { if (head == NULL) return
head; ListNode *curNode = head; while (curNode->next) { ListNode *nextNode = curNode->next; curNode->next = nextNode->next; nextNode->next = head; head = nextNode; } return
head; } }; int
main() { int
arr[10] = {1, 2, 3, 4, 5, 6, 7, 8}; ListNode* list[10]; int
len = 3; for ( int
i = 0; i < len; i ++) list[i] = new
ListNode(arr[i]); for ( int
i = 0; i < len-1; i ++) list[i]->next = list[i+1]; ( new
Solution())->reorderList(list[0]); ListNode *lists = list[0]; while (lists) { cout << lists->val << " " ; lists = lists->next; } cout << endl; return
0; } |
原文:http://www.cnblogs.com/xinsheng/p/3550121.html