Leetcode 0021.Merge Two Sorted Lists(python)
21. Merge Two Sorted Lists
题目
You are given the heads of two sorted linked lists list1 and list2.
Merge the two lists into one sorted list. The list should be made by splicing together the nodes of the first two lists.
Return the head of the merged linked list.
Example 1:
1 | Input: list1 = [1,2,4], list2 = [1,3,4] |
Example 2:
1 | Input: list1 = [], list2 = [] |
Example 3:
1 | Input: list1 = [], list2 = [0] |
题目大意
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
你选用何种方法解题?
本题的核心是合并两个有序链表。
| 方法 | 时间复杂度 | 空间复杂度 | 是否推荐 |
|---|---|---|---|
| 迭代(哑节点) | O(n + m) | O(1) | 推荐 |
| 递归 | O(n + m) | O(n + m) | 推荐 |
方法选择理由:
- 迭代(哑节点):时间效率高,空间复杂度 O(1),代码直观
- 递归:代码简洁优雅,适合理解递归思想
解题过程
问题分析
输入:两个升序链表 list1 和 list2
输出:合并后的升序链表
关键约束:
- 链表已按升序排列
- 需要原地合并,不创建新节点
核心洞察
- 迭代方法:使用哑节点简化边界处理,双指针遍历两个链表,每次选择较小的节点
- 递归方法:将问题分解为子问题,每次选择较小的头节点,然后递归合并剩余部分
迭代算法流程
以 list1 = [1,2,4], list2 = [1,3,4] 为例:
1 | 初始化:dummy -> None, curr = dummy |
递归算法流程
以 list1 = [1,2,4], list2 = [1,3,4] 为例:
1 | merge([1,2,4], [1,3,4]) |
这些方法具体怎么运用?
方法一:迭代(哑节点)(推荐)
数据结构:哑节点 + 指针
核心逻辑:
- 创建哑节点:
dummy = ListNode(),curr = dummy - 遍历两个链表:
- 如果
list1.val < list2.val,取 list1 节点 - 否则,取 list2 节点
- 如果
- 连接剩余节点:将未遍历完的链表连接到结果末尾
- 返回结果:返回
dummy.next
方法二:递归
核心逻辑:
- 终止条件:如果其中一个链表为空,返回另一个链表
- 递归步骤:
- 如果
list1.val < list2.val,取 list1 作为当前节点,递归合并list1.next和list2 - 否则,取 list2 作为当前节点,递归合并
list1和list2.next
- 如果
- 返回结果:返回当前节点
边界情况处理:
| 边界情况 | 处理方式 |
|---|---|
| 两个链表都为空 | 返回空链表 |
| 其中一个链表为空 | 返回另一个链表 |
| 链表长度不同 | 连接剩余节点 |
复杂度
| 方法 | 时间复杂度 | 空间复杂度 | 说明 |
|---|---|---|---|
| 迭代(哑节点) | O(n + m) | O(1) | n 和 m 分别是两个链表的长度 |
| 递归 | O(n + m) | O(n + m) | 递归栈深度 |
总结与最佳选择
最快算法:迭代(哑节点)。空间复杂度更低。
工程最优选择:迭代(哑节点)。理由如下:
- 空间效率高:O(1) 空间复杂度
- 代码直观:逻辑清晰,易于理解和维护
- 适用性广:不涉及递归深度限制
各方法适用场景:
- 迭代(哑节点):生产环境首选
- 递归:教学演示递归思想
Code
方法一:迭代(哑节点)(推荐)
1 | from typing import Optional |
方法二:递归
1 | from typing import Optional |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.

