Single Number @ LeetCode (Python)
Search Insert Position @ LeetCode (Python)

Merge k Sorted Lists @ LeetCode (Python)

kitt posted @ 2014年2月13日 19:59 in LeetCode , 4691 阅读

用最小堆, 每个list有一个指针, k个指针放入堆中, 每次pop出最小的, 然后指向相应list的下一个node, 再push入堆。

最小堆是一个数组, 所有元素满足heap[k] <= heap[2*k+1]和heap[k] <= heap[2*k+2], heap[0]即堆顶最小。

Python堆操作真方便:

heapq.heapify(a) 把list a中元素调换顺序使其成为最小堆, a还是list

heapq.heappush(a, (10, sth_else))  把(10, sth_else)插入堆a中, a仍为最小堆, 也可以只插入数10

heapq.heappop(a) 弹出堆顶元素, a中的最小值

heapq.heappushpop(a, (10, sth_else)) 先push再pop, 效率比依次调用heappush()和heappop()高 

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    # @param a list of ListNode
    # @return a ListNode
    def mergeKLists(self, lists):
        heap = []
        for node in lists:
            if node != None: heap.append((node.val, node))
        heapq.heapify(heap)
        head = ListNode(0); curr = head
        while heap:
            pop = heapq.heappop(heap)
            curr.next = ListNode(pop[0])
            curr = curr.next
            if pop[1].next: heapq.heappush(heap, (pop[1].next.val, pop[1].next))
        return head.next
Avatar_small
yzl232 说:
2014年6月21日 12:32

 一般题目会要求不可以不断重建新的ListNode。 (不然可以直接拿出所有vals。 排序。 建立新的Node)

17行可以改成: cur.next = pop[1]


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter