文章

链表#简单#合并两个有序链表

链表#简单#合并两个有序链表

前文

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

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 进行授权

热门标签