数据结构与算法之 leetcode 队列合并 K 个链表 优先队列实现

数据结构与算法阿木 发布于 2025-07-12 7 次阅读


队列合并 K 个链表(优先队列实现)

在LeetCode中,有一个经典的题目叫做“队列合并 K 个链表”。这个问题要求我们合并K个链表,使得合并后的链表中的元素按照升序排列。这是一个典型的数据结构与算法问题,我们可以使用优先队列(也称为最小堆)来实现。

问题分析

假设我们有K个链表,每个链表都是按照升序排列的。我们的目标是合并这些链表,并返回一个合并后的链表,其中元素也是按照升序排列的。

输入:

- K个链表的头节点列表 `heads`

输出:

- 合并后的链表的头节点

示例:


输入:[1->4->5, 1->3->4, 2->6]


输出:1->1->2->3->4->4->5->6


解决方案

为了解决这个问题,我们可以使用优先队列。优先队列是一种特殊的队列,它允许我们以对数时间复杂度插入元素,并以常数时间复杂度获取最小元素。

步骤:

1. 创建一个优先队列,用于存储链表节点。

2. 遍历每个链表,并将第一个节点(如果存在)加入优先队列。

3. 当优先队列为空时,结束循环。

4. 从优先队列中取出最小元素,将其添加到结果链表中。

5. 如果该元素对应的链表还有下一个节点,将其加入优先队列。

6. 重复步骤4和5,直到优先队列为空。

代码实现

下面是使用Python实现的代码:

python

import heapq

class ListNode:


def __init__(self, val=0, next=None):


self.val = val


self.next = next

class Solution:


def mergeKLists(self, lists):


创建一个优先队列


pq = []


初始化优先队列


for head in lists:


if head:


heapq.heappush(pq, (head.val, head))



创建结果链表的头节点


dummy = ListNode(0)


current = dummy



当优先队列为空时,结束循环


while pq:


从优先队列中取出最小元素


val, node = heapq.heappop(pq)


将最小元素添加到结果链表中


current.next = ListNode(val)


current = current.next


如果该元素对应的链表还有下一个节点,将其加入优先队列


if node.next:


heapq.heappush(pq, (node.next.val, node.next))



返回结果链表的头节点


return dummy.next


时间复杂度和空间复杂度

- 时间复杂度:O(NlogK),其中N是所有链表节点总数,K是链表数量。每次从优先队列中取出最小元素的时间复杂度是O(logK),我们需要进行N次这样的操作。

- 空间复杂度:O(K),优先队列中最多存储K个节点。

总结

使用优先队列合并K个链表是一种高效的方法。通过优先队列,我们可以以对数时间复杂度获取最小元素,从而实现合并链表的目的。这种方法在处理类似的问题时非常有用,尤其是在需要保持元素顺序的情况下。