Leetcode 23. Merge k Sorted Lists
题目:
解法1:heap
利用heap,保持heap size在k,这边在python里可以用priorityqueue也可以直接用heap。用priorityqueue的话python3不行,因为python3里面定义不太一样:
python3 use from queue import PriorityQueue, instead of from Queue. (the case of ‘Q’)
TypeError ‘<’ not supported between instances of ‘ListNode’ and ‘ListNode’:
python版本的priorityqueue写法:
from Queue import PriorityQueue
class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
head = point = ListNode(0)
q = PriorityQueue()
for l in lists:
if l:
q.put((l.val, l))
while not q.empty():
val, node = q.get()
point.next = ListNode(val)
point = point.next
node = node.next
if node:
q.put((node.val, node))
return head.next
python3版本heapq写法:
这边heap的每个元素都是一个tuple,tuple包含两个元素,在heapq进行construct的时候,会调用这个operator ”<“,而比较两个tuple,python默认会从第一个元素开始比较起,这才是这么写正确的原因
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
h = [(l.val, idx) for idx, l in enumerate(lists) if l]
heapq.heapify(h)
head = cur = ListNode(None)
while h:
val, idx = heapq.heappop(h)
cur.next = ListNode(val)
cur = cur.next
node = lists[idx].next
lists[idx] = lists[idx].next
if node:
heapq.heappush(h, (node.val, idx)