链表#简单#合并两个有序链表
链表#简单#合并两个有序链表
前文
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
正文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
}
};
解法1
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
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if (list1 == nullptr)
return list2;
if (list2 == nullptr)
return list1;
ListNode* head = new ListNode(-1);
ListNode* prev = head;
while (list1 != nullptr && list2 != nullptr) {
if (list1 -> val < list2->val) {
prev->next = list1;
list1 = list1->next;
} else {
prev->next = list2;
list2 = list2->next;
}
prev = prev->next;
}
prev->next = list1 == nullptr ? list2 : list1;
return head->next;
}
};
循环中,对比节点值,拼接下一个,如果其中一个为空,则说明剩下的另一个应该拼接至最后。 示例:
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
// 1->2->4->5
// 3->4->6
头节点 = -1->nullptr
当前节点 = 头节点
// 循环:
如果1<3
当前节点 = -1->1->2->4->5
当前节点 = 1->2->4->5
如果2<3
当前节点 = 1->2->4->5
当前节点 = 2->4->5
如果 !4<3
当前节点 = 2->3->4->6
当前节点 = 3->4->6
如果 !4<4
当前节点 = 3->4->6
当前节点 = 4->6
如果 4<6
当前节点 = 4->4->5
当前节点 = 4->5
如果 5<6
当前节点 = 4->5
当前节点 = 5
此时其中一个为空
设置 4->5->6->nullptr
因为当前节点已经循环到值为4的节点了,所以返回头节点指向下一个
即 头节点->next = 1->2->3->4->4->5->6->nullptr
本文由作者按照 CC BY 4.0 进行授权