23. Merge k Sorted Lists
21. Merge Two Sorted Lists
算是 Q21 的进阶版,想要简单复制 Q21 的思路,依次比较当前k个候选,排最小的val进入结果。然后就TLE了...看来线性时间 O(k*N) 过不了。
这个思路下,每次都要比较k个候选,很多node被拿来比较了多次。要减少这个重复,可以把lists
两两merge,直到merge成一个,其实还是merge sort
的思路,这样的话可以直接copy Q21的code,加个iteration就可以了。
另一个优化思路是,既然这边每次都要对k个候选node比较出最小值,直接维护compare
这个数组的最小值即可,改用heap
来实现,过了。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
res = ListNode(0)
cur = res
while True:
compare = {}
for n, l in enumerate(lists):
if l: compare[n] = l.val
if not compare: break
pick = min(compare.items(), key = lambda item :item[1])
cur.next = lists[pick[0]]
cur = cur.next
if lists[pick[0]]: lists[pick[0]] = lists[pick[0]].next
return res.next
Last updated
Was this helpful?