← 链表 · Linked List / 合并两个有序链表 待审核 11 / 14
merge · 哨兵拼接

合并两个有序链表

两条已排好序的链表 A、B,要并成一条仍然有序的链表。这正是归并排序的合并步在链表上的形态。链表合并相比数组的优势在于——无需搬移数据,只改 next 指针:两边各派一个指针,每次挑当前更小的那个节点接到结果尾部,然后该侧前进。难点在于结果链的起点从何而来:用一个哨兵 dummy(见 链表基础)作为起点,tail 一路向后拼接,最后返回 dummy.next,即可省去「第一个节点要特判」的处理。

稳定性来自 <=:比较写 a.val <= b.val(相等时优先接 A)能保持稳定——相等的元素里,原本在 A 的仍排在原本在 B 的前面。归并排序靠这个保证整体稳定。

一边走完后要「接上剩余段」:循环以 a && b 为条件,一旦某条空了就退出。此时另一条剩下的整段本身已经有序,直接 tail.next = a ?? b 一句接上即可,无需逐个再比。递归写法更短:merge(a,b) 取较小的头,其 next 接 merge(剩余, 另一条),但栈深 O(m+n)O(m+n)