本题是一个力扣 hard 难度题目,下面是题目链接:
https://leetcode-cn.com/problems/merge-k-sorted-lists/
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
首先暴力算法:k指针法,用k个指针指向k个链表,每一次选出k个链表中最小的值。时间复杂度为 O(k * N)。用 python 编写会超时。
小堆栈:用小堆栈存储所有链表中的元素,每次取出小堆栈中的最小值,时间复杂度 O(N * logN)。一共从小堆栈中取出 N 个元素,每取出一个元素需要 logN 的时间。
升级版小堆栈:用小堆栈存储所有链表中的开头元素和其索引,每次取出小堆栈中的最小值,并将对应索引的链表向后移一位,直到取出所有元素。时间复杂度为 O(N * log k)。
# 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:
# time complexity O(Nlogk)
import heapq
queue = []
for i in range(len(lists)):
if lists[i]:
heapq.heappush(queue, [lists[i].val, i])
lists[i] = lists[i].next
dummyHead = ListNode(-1)
node = dummyHead
while queue:
val, index = heapq.heappop(queue)
node.next = ListNode(val)
node = node.next
if lists[index]:
heapq.heappush(queue, [lists[index].val, index])
lists[index] = lists[index].next
return dummyHead.next