不能直接用list.sort()合并有序链表,因其需先收集节点再排序,时间复杂度退化为o((n+m)log(n+m)),浪费已有序前提;应采用双指针原地归并,辅以dummy头节点简化边界处理。

为什么不能直接用 list.sort() 合并有序链表
因为链表节点是分散在内存中的对象,list.sort() 需要先把所有节点收集到列表里再排序,时间复杂度退化为 O(n + m) + O((n + m) log(n + m)),完全浪费了“已有序”这个前提。真正高效的做法是双指针原地遍历,类似归并排序的合并阶段。
标准双指针合并:用 dummy 头节点避免边界判断
手动处理头节点归属(比如谁更小谁当新链表头)容易漏掉空链表、单节点等边界情况。引入一个虚拟头节点 dummy,让所有节点统一追加到 dummy.next,最后返回 dummy.next 即可。
常见错误现象:NoneType 错误、漏掉剩余非空链表的尾部节点、循环中忘记移动指针。
- 始终比较
l1.val和l2.val,把较小节点接在当前cur.next后,并向前移动对应链表指针 - 任一链表耗尽后,直接把另一链表剩余部分整体接上(不用再逐个遍历)
- 每轮操作后必须更新
cur = cur.next,否则会覆盖前一个节点
def mergeTwoLists(l1, l2):
dummy = ListNode(0)
cur = dummy
while l1 and l2:
if l1.val <h3>递归写法简洁但要注意栈深度和 <code>None</code> 判定</h3><p>递归本质是“先确定头节点,再合并剩下部分”,逻辑清晰,但 Python 默认递归深度约 1000,链表过长会触发 <code>RecursionError</code>。另外,必须显式处理 <code>l1 is None</code> 或 <code>l2 is None</code> 的终止条件,不能只靠 <code>if not l1</code>——如果节点值为 0,<code>if not l1</code> 会误判。</p>
- 递归基:当
l1 is None时返回;当 l2 is None时返回l1 - 递归体:选较小节点作为新头,其
next指向“剩余部分的合并结果” - 性能影响:空间复杂度
O(n + m)(递归调用栈),而迭代版是O(1)
def mergeTwoLists(l1, l2):
if l1 is None:
return l2
if l2 is None:
return l1
if l1.val <h3>测试时别忽略空链表和全相同值场景</h3><p>真实数据中常有 <code>l1 = None</code>、<code>l2 = ListNode(1)</code> 或两个链表值完全相等(如 <code>[1,1]</code> 和 <code>[1,1,1]</code>)。这些场景下,逻辑是否仍能正确连接所有节点、不跳过重复值、不引发 <code>AttributeError</code>,比平均-case 更考验实现健壮性。</p><p>最容易被忽略的是:在 while 循环外接剩余链表时,写成 <code>cur.next = l1 if l1 else l2</code> 是安全的;但如果错写成 <code>cur.next = l1 or l2</code>,而 <code>l1</code> 是值为 0 的节点,就会意外跳过它——Python 的 <code>or</code> 返回第一个真值,不是“非空就取”。</p>Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











