Hot100:合并K个升序链表(Merge k Sorted Lists)分治归并 O(N log k) ACERS 解析
副标题 / 摘要 这题本质是“k 路归并”。如果直接一条条串行并入,性能会退化;用分治按二叉树方式两两合并,能把复杂度优化到 O(N log k)。本文按 ACERS 模板把思路推导、工程映射和多语言实现一次讲透。 预计阅读时长:12~16 分钟 标签:Hot100、链表、分治、归并 SEO 关键词:Merge k Sorted Lists, 合并K个升序链表, 分治归并, LeetCode 23, O(N log k) 元描述:从串行归并到分治归并,系统讲解 LeetCode 23 的最优复杂度解法与工程实践。 目标读者 正在刷 Hot100,已经掌握 LeetCode 21 的同学 想把“双链表归并”升级为“k 路归并模板”的开发者 在服务端做多路有序流合并(日志、时间线、分片结果)的工程师 背景 / 动机 LeetCode 23 是 LeetCode 21 的自然升级版: 21:2 路归并 23:k 路归并 核心挑战不在“能不能合并”,而在“如何把复杂度控制在可接受范围”。 如果每次把结果链表继续和下一条链表做串行归并,早期节点会被反复遍历,实际性能很容易退化。 核心概念 N:所有链表节点总数 k:链表条数 串行归并:从左到右不断把当前结果和下一条链表合并 分治归并:像归并排序一样,两两合并,按层收敛 最小堆方案:维护 k 个当前头节点,每次弹出最小值并推进其所在链表 A — Algorithm(题目与算法) 题目还原 给你一个链表数组 lists,每个链表都按升序排列。 请将所有链表合并到一个升序链表中,并返回合并后的头节点。 输入输出 名称 类型 描述 lists ListNode[] k 条升序链表,元素可为空 返回 ListNode 合并后的升序链表头节点 示例 1 输入: lists = [[1,4,5],[1,3,4],[2,6]] 输出: [1,1,2,3,4,4,5,6] 示例 2 输入: lists = [] 输出: [] C — Concepts(核心思想) 思路推导:从朴素到最优 朴素法 A:拉平到数组后排序 ...