递归合并有序链表的核心是让当前层只决定“谁当头”,其余交给下一层:先检查空链表并直接返回非空链表,再比较节点值,小者为头并将其next指向剩余部分的递归合并结果,全程复用原节点、无新建,最终返回即完整链表头。
递归合并有序链表的关键,不在于“写对函数”,而在于理解每一步中指针如何被重新绑定、谁控制返回权、以及原节点如何自然拼接成新结构。核心是让逻辑自洽:当前层只决定“谁当头”,其余交给下一层——变量重组就发生在这个交接过程中。
递归入口的边界处理必须前置
递归函数第一件事不是比较,而是检查空链表:
- 若 l1 为空,直接返回 l2 —— 此时 l2 整个链表天然有序,无需改动;
- 若 l2 为空,直接返回 l1 —— 同理,l1 就是结果;
- 这两个判断必须放在最前,否则后续访问
l1->val或l2->val会崩溃。
谁当头,谁负责挂载子链
当两个链表都非空时,选出值更小的节点作为当前合并结果的头节点:
- 若 l1->val ≤ l2->val,说明 l1 是当前最小节点,它应成为本轮返回的头;
- 那么 l1 的 next 指针不能丢,要指向“l1 剩余部分与 l2 全量”的合并结果 —— 即递归调用
mergeTwoLists(l1->next, l2); - 同理,若 l2 更小,则 l2 成为头,其 next 指向
mergeTwoLists(l1, l2->next)。
这个过程本质是“拆头 + 递归挂尾”,所有节点复用,无新建,变量重组就在赋值 l1->next = ... 这一行完成。
返回值即新链表头,无需额外构造
每次递归调用都返回一个有效链表头,且该头节点始终是当前参与比较的两个节点中值较小者:
- 最深层递归返回的是某个链表的尾节点(或空),逐层回溯时,上层节点通过
->next把它串起来; - 最终顶层调用返回的,就是整个合并后链表的真正头节点;
- 不需要 dummy 节点,也不需要额外管理 tail 指针——递归天然维护了链式依赖关系。
注意值相等时的稳定处理
题目未要求去重,所以遇到 l1->val == l2->val 时,按 ≤ 判断归入 l1 分支是安全且稳定的:
- l1 节点先接入,l1 向后走,l2 暂留;
- 下一轮仍可能比较相同值,但 l1 已推进,不会死循环;
- 这种处理保证相同值节点相对顺序不变(l1 中的总在 l2 中同值节点之前),符合多数场景需求。

















