21.合并两个有序链表- 力扣(LeetCode)

题目:

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

示例 1:

21.合并两个有序链表- 力扣(LeetCode)_第1张图片

输入:l1 = [1,2,4], l2 = [1,3,4]

输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []

输出:[]

示例 3:

输入:l1 = [], l2 = [0]

输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]

  • -100 <= Node.val <= 100

  • l1 和 l2 均按 非递减顺序 排列

思路如下:
  • 创建一个哨兵节点,作为合并后的新链表头节点的前一个节点。这样可以避免单独处理头节点,也无需特判链表为空的情况。

  • 比较 list1和 list2的节点值,如果 list1的节点值小,则把 list1加到新链表的末尾,然后把 list1替换成它的下一个节点。如果 list2的节点值小则同理。如果两个节点值一样,那么把谁加到新链表的末尾都是一样的,不妨规定把 list1加到新链表末尾。

  • 重复上述过程,直到其中一个链表为空。

  • 循环结束后,其中一个链表可能还有剩余的节点,将剩余部分加到新链表的末尾。

  • 最后,返回新链表的头节点,即哨兵节点的下一个节点。

题解如下:
class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        cur = dummy = ListNode()  # 用哨兵节点简化代码逻辑
        while list1 and list2:
            if list1.val > list2.val:
                cur.next = list2  # 把 list2 加到新链表中
                list2 = list2.next
            else:  # list1 <= list2的情况
                cur.next = list1  # 把 list1 加到新链表中
                list1 = list1.next
            cur = cur.next  # 新链表指针指向新节点,用于更新链表
        cur.next = list1 or list2  # 拼接剩余链表
        return dummy.next
示例流程:

假设 list1 = [1,3],list2 = [2,4]:

  1. 初始 dummy -> None,cur 指向 dummy。

  2. 比较 1 (list1) 和 2 (list2),选 1:

    cur.next = list1 → 新链表为 dummy -> 1

    list1 移动到 3,cur 移动到 1。

  3. 比较 3 (list1) 和 2 (list2),选 2:

    cur.next = list2 → 新链表为 dummy -> 1 -> 2

    list2 移动到 4,cur 移动到 2。

  4. 比较 3 (list1) 和 4 (list2),选 3:

    cur.next = list1 → 新链表为 dummy -> 1 -> 2 -> 3

    list1 已空,cur 移动到 3。

  5. 拼接剩余 list2(节点 4):

    cur.next = list2 → 最终链表 dummy -> 1 -> 2 -> 3 -> 4。

  6. 最终返回 dummy.next,即合并后的链表头节点 1。

你可能感兴趣的:(链表,leetcode,数据结构)