21. 合并两个有序链表

21. 合并两个有序链表

你的 mergeTwoLists 函数用于合并两个已排序的链表。代码中存在缩进错误和一些细节问题。以下是修正后的代码以及详细注释:

python 复制代码
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
    # 创建一个哑节点(dummy node)并初始化指针
    dummy = ListNode(0)
    temp = dummy

    # 遍历两个链表,直到其中一个为空
    while l1 and l2:
        if l1.val <= l2.val:
            temp.next = l1
            l1 = l1.next
        else:
            temp.next = l2
            l2 = l2.next
        temp = temp.next

    # 将剩余的节点连接到结果链表
    temp.next = l1 if l1 else l2

    # 返回合并后的链表头节点
    return dummy.next

详细注释

  1. 定义链表节点类:

    python 复制代码
    class ListNode:
        def __init__(self, val=0, next=None):
            self.val = val
            self.next = next
  2. 合并两个有序链表的函数:

    python 复制代码
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
  3. 创建哑节点:

    python 复制代码
    dummy = ListNode(0)
    temp = dummy
    • 创建一个哑节点 dummy,并初始化指针 temp 指向 dummy。哑节点用于简化链表操作,最终返回合并后的链表头节点。
  4. 遍历两个链表,直到其中一个为空:

    python 复制代码
    while l1 and l2:
        if l1.val <= l2.val:
            temp.next = l1
            l1 = l1.next
        else:
            temp.next = l2
            l2 = l2.next
        temp = temp.next
    • 比较 l1 和 l2 的当前节点值,将较小值的节点连接到结果链表 temp 的 next,并移动相应链表的指针。
    • 移动 temp 指针到下一个节点。
  5. 连接剩余的节点:

    python 复制代码
    temp.next = l1 if l1 else l2
    • 如果 l1 或 l2 还有剩余的节点,直接连接到 temp 的 next。
  6. 返回合并后的链表头节点:

    python 复制代码
    return dummy.next
    • 返回哑节点 dummy 的 next,即合并后的链表头节点。

示例

假设链表 l1 为 1 -> 2 -> 4,链表 l2 为 1 -> 3 -> 4。

  1. 初始状态:

    • dummy: 0 -> None
    • temp 指向 dummy
  2. 第一次比较:

    • l1.val = 1, l2.val = 1
    • 将 l1 连接到 temp.next,移动 l1 到下一个节点
    • dummy: 0 -> 1 -> 2 -> 4
    • temp: 1 -> 2 -> 4
  3. 第二次比较:

    • l1.val = 2, l2.val = 1
    • 将 l2 连接到 temp.next,移动 l2 到下一个节点
    • dummy: 0 -> 1 -> 1 -> 3 -> 4
    • temp: 1 -> 1 -> 3 -> 4
  4. 继续比较并合并:

    • 继续上述过程,直到 l1 和 l2 中一个为空
  5. 连接剩余的节点:

    • 将剩余的 l1 或 l2 连接到 temp.next
    • 最终 dummy 连接的链表为 0 -> 1 -> 1 -> 2 -> 3 -> 4 -> 4
  6. 返回合并后的链表头节点:

    • 返回 dummy.next 即 1 -> 1 -> 2 -> 3 -> 4 -> 4

通过这种方式,可以将两个有序链表合并为一个新的有序链表。

相关推荐
【心态好不摆烂】11 小时前
数据结构基础精讲3
数据结构·算法
岑梓铭11 小时前
《考研408数据结构》第七章(B树 和 B+树)复习笔记
数据结构·笔记·b树·考研·408
岑梓铭17 小时前
《考研408数据结构》第八章(排序)复习笔记
数据结构·笔记
Pniubi2 天前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表
nice_lcj5202 天前
LRU 缓存入门:它是什么、怎么用、面试怎么手写
java·数据结构·缓存·面试·lru
꧁细听勿语情꧂2 天前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
Pniubi2 天前
关于算法用现成数据结构和手撕
数据结构
老师我太想进步了20263 天前
【数据结构-6】算法美学之单链表(1)
数据结构·算法
希望我万事顺遂3 天前
力扣hot100-滑动窗口最大值
数据结构·算法·leetcode
꧁细听勿语情꧂3 天前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法