一、题目

一个链表,特点是奇数位升序偶数位降序,使得链表变成升序的。

1
2
3
1 200 2 100 3 50 4 30 5
===>
1 2 3 4 5 30 50 100 200

二、分析

这道题目三步走:

  • 首先根据奇数位和偶数位拆分成两个链表
  • 然后对偶数位链表进行反转
  • 最后将两个有序链表进行合并
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
77
78
struct Node {
int val;
Node* next;

explicit Node(int x) : val(x), next(nullptr) {}
};

class Solution {
public:
std::pair<Node*, Node*> split_lists(Node* head) {
Node* head1 = nullptr;
Node* head2 = nullptr;
Node* cur1 = nullptr;
Node* cur2 = nullptr;
int count = 1;
while (head != nullptr) {
if (count % 2 == 1) {
if (head1 == nullptr) {
cur1 = head;
head1 = cur1;
} else {
cur1->next = head;
cur1 = cur1->next;
}
} else {
if (head2 == nullptr) {
cur2 = head;
head2 = cur2;
} else {
cur2->next = head;
cur2 = cur2->next;
}
}
count++;
head = head->next;
}
cur1->next = nullptr;
cur2->next = nullptr;
return std::pair<Node*, Node*>{head1, head2};
}

Node* reverse_list(Node* head) {
Node* pre = nullptr;
Node* next = nullptr;
while (head != nullptr) {
next = head->next;
head->next = pre;
pre = head;
head = next;
}
return pre;
}

Node* combine_list(Node* head1, Node* head2) {
if (head1 == nullptr || head2 == nullptr) {
return head1 != nullptr ? head1 : head2;
}
Node* head = head1->val < head2->val ? head1 : head2;
Node* cur1 = head == head1 ? head1 : head2;
Node* cur2 = head == head1 ? head2 : head1;
Node* pre = nullptr;
Node* next = nullptr;
while (cur1 != nullptr && cur2 != nullptr) {
if (cur1->val < cur2->val) {
pre = cur1;
cur1 = cur1->next;
} else {
next = cur2->next;
pre->next = cur2;
cur2->next = cur1;
pre = cur2;
cur2 = next;
}
}
pre->next = cur1 == nullptr ? cur2 : cur1;
return head;
}
};