Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Subscribe to see which companies asked this question
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
import heapq
class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
if len(lists) == 0:
return None
head = ListNode(0)
r_pointer = head
heap = []
heapq.heapify(heap)
index_hash = {}
for i in range(len(lists)):
if lists[i]:
heapq.heappush(heap, lists[i].val)
index_hash.setdefault(lists[i].val, []).append(i)
lists[i] = lists[i].next
while len(heap) > 0:
item = heapq.heappop(heap)
r_pointer.next = ListNode(item)
r_pointer = r_pointer.next
if lists[index_hash[item][0]]:
heapq.heappush(heap, lists[index_hash[item][0]].val)
index_hash.setdefault(lists[index_hash[item][0]].val, []).append(index_hash[item][0])
lists[index_hash[item][0]] = lists[index_hash[item][0]].next
del index_hash[item][0]
return head.next
这种方法用到了堆的数据结构,原理比较简单。维护一个大小为k的堆,每次取堆顶的最小元素放到结果中,然后读取该元素的下一个元素放入堆中,重新维护好。因为每个链表是有序的,每次又是去当前k个元素中最小的,所以当所有链表都读完时结束,这个时候所有元素按从小到大放在结果链表中。这个算法每个元素要读取一次,即是k*n次,然后每次读取元素要把新元素插入堆中要logk的复杂度,所以总时间复杂度是O(nklogk)。空间复杂度是堆的大小,即为O(k)。