一、题目描述

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

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

二、解题思路 & 代码

优先队列 (堆) 来实现

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution:
    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
        if not lists:
            return None
        import heapq
        heap = []
        # 首先 for 嵌套 while 就是将所有元素都取出来放入堆中
        for node in lists:
            while node:
                heapq.heappush(heap, node.val)
                node = node.next
        dummy = ListNode(None)
        cur = dummy
        # 依次将堆中的元素取出(因为是小顶堆,所以每次取出来的都是目前堆中最小的元素)
        # 而后重新构建一个列表返回
        while heap:
            tmp_node = ListNode(heappop(heap))
            cur.next = tmp_node
            cur = tmp_node
        return dummy.next
  1. 空间复杂度 O ( k ) O(k) O(k)
  2. 时间复杂度 O ( n l o g ( k ) ) O(nlog(k)) O(nlog(k)) n n n 是所有节点个数, k k k 是链表数

参考:

  1. LeetCode题解