LC 23堆与优先队列困难第 56 / 95 题

合并 K 个升序链表

Merge k Sorted Lists

堆分治归并
本机进度仅保存在当前浏览器

题目描述

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例:lists = [[1, 4, 5], [1, 3, 4], [2, 6]],输出 [1, 1, 2, 3, 4, 4, 5, 6]。

解题思路

  1. 小顶堆做法:把 k 个链表头放入堆,每次弹出最小节点接到结果尾部,再把它的 next 入堆,O(N log k)。
  2. Python 的 heapq 不能直接比较节点,堆元素用 (节点值, 序号, 节点) 三元组回避比较。
  3. 分治做法同样优秀:两两合并、逐层向上,共 log k 层,每层总代价 O(N),与堆做法同数量级且常数更小。

参考实现

查看参考实现Python · 建议先自行作答
import heapq

def mergeKLists(lists):
    # 小顶堆维护 k 个链表的当前头节点
    heap = [(node.val, i, node) for i, node in enumerate(lists) if node]
    heapq.heapify(heap)
    dummy = tail = ListNode(0)
    while heap:
        val, i, node = heapq.heappop(heap)
        tail.next = node
        tail = node
        if node.next:
            heapq.heappush(heap, (node.next.val, i, node.next))
    return dummy.next

复杂度与归属

时间复杂度O(N log k)
空间复杂度O(k)
所属分类堆与优先队列
题源LeetCode 23

关联教程

返回题图鉴