【力扣-21. 合并两个有序链表 ✨】Python笔记

🔗 合并两个有序链表:像拉拉链一样合并数据

摘要:本文详解 LeetCode 21 题"合并两个有序链表",通过"虚拟头节点 + 双指针比较"的思路,实现链表合并的优雅解法,附带代码实现与核心知识点解析。


📚 核心知识点:虚拟头节点与双指针

在处理链表合并问题时,我们常面临两个痛点:需要频繁处理头节点的边界情况 和 无法直接访问前驱节点。

虚拟头节点(Dummy Node) 是一个非常实用的技巧:

  • 创建一个临时的"哨兵"节点作为新链表的起始点。
  • 所有合并操作都接在这个节点之后。
  • 最终返回 dummy.next 即可得到完整链表。
  • 优势:避免了对头节点的特殊判断,让代码更简洁。

双指针比较:

  • 两个指针分别指向两个链表的当前节点。
  • 比较大小,将较小的节点接在结果链表后。
  • 移动对应指针,继续比较,直到其中一个链表为空。

📝 题目解析:LeetCode 21. 合并两个有序链表

题目描述 :

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

示例 :

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

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


💻 代码实现
python 复制代码
# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        # 创建虚拟头节点,简化头节点处理
        dummy = ListNode()
        # 当前节点指针,用于构建新链表
        current = dummy
        
        # 双指针遍历两个链表
        while list1 and list2:
            # 比较大小,将较小节点接在结果链表后
            if list1.val <= list2.val:
                current.next = list1
                list1 = list1.next  # 移动 list1 指针
            else:
                current.next = list2
                list2 = list2.next  # 移动 list2 指针
            current = current.next  # 移动结果链表指针
        
        # 处理剩余节点(其中一个链表可能还有剩余)
        if list1:
            current.next = list1
        else:
            current.next = list2
        
        # 返回合并后的链表(跳过虚拟头节点)
        return dummy.next

🚀 解题思路总结
  1. 虚拟头节点 :创建 dummy 节点,避免处理头节点的边界情况。
  2. 双指针比较 :用 current 指针构建新链表,list1 和 list2 指针分别遍历两个链表。
  3. 合并逻辑 :比较 list1 和 list2 的当前节点值,将较小的节点接在 current 后,移动对应指针。
  4. 处理剩余节点:当其中一个链表遍历完后,将另一个链表的剩余部分直接接在结果链表后。
  5. 返回结果 :返回 dummy.next,即合并后的链表头节点。

📌 关键点提示
  • 虚拟头节点:让代码更简洁,避免对头节点的特殊判断。
  • 双指针:同时遍历两个链表,比较大小并合并。
  • 剩余节点处理:其中一个链表遍历完后,另一个链表的剩余部分直接接在结果链表后。

通过以上步骤,我们可以高效地合并两个有序链表,时间复杂度为 O(m + n),空间复杂度为 O(1)。

相关推荐
snhna15 分钟前
DeerFlow 2.x 源码拆解:多智能体委派、Skills、沙箱与 Linux 部署实战
人工智能·python
Wx-bishekaifayuan24 分钟前
springboot桂味美食分享系统40540-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
Metaphor69237 分钟前
如何快速拆分超大 Excel 文件【Python 教程】
python·excel
孟健1 小时前
从单体失控到解耦管道:用 Unix 哲学重构 Anthropic 式多 Agent 动态工作流
人工智能·python·架构
小白快快跑哦1 小时前
python-字符串全解(六):正则表达式-前后相断言
开发语言·python·正则表达式·前后相断言
kimnoic1 小时前
Python数据分析中正则表达式匹配字符串与常用函数示例详解
开发语言·python
许墨の小蝴蝶1 小时前
Pillow 替换图片文字后字号偏小的排查
python·pillow
朝朝辞暮i2 小时前
第 01 讲:Python 变量、对象、数据类型与内存引用
开发语言·python
Tisfy2 小时前
LeetCode 2333.最小差值平方和:排序 + 数学计算(不用二分)
数学·算法·leetcode·题解·贪心·排序
aqiu1111112 小时前
【C++算法打怪专栏】LeetCode 217. 存在重复元素(解法总结)
c++·算法·leetcode