python实现leetcode之23. 合并K个升序链表(小根堆)

解题思路

根据头节点的值创建小根堆,堆里每个元素就是链表,为了相同值的可比较性,在中间加入所在原列表的下标idx
合并的时候不断取出最小元素,如果链表没有取完,将剩余部分放回堆里
直到堆为空,处理结束
https://leetcode-cn.com/problems/merge-k-sorted-lists/

代码

# 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:
        min_heap = []
        for idx, li in enumerate(lists):
            if li:
                heapq.heappush(min_heap, (li.val, idx, li))
        return heap_merge(min_heap)


def heap_merge(min_heap):
    if not min_heap: return None
    mi, idx, head = heapq.heappop(min_heap)
    if head.next:
        heapq.heappush(min_heap, (head.next.val, idx, head.next))
    head.next = heap_merge(min_heap)
    return head

效果图

你可能感兴趣的:(python实现leetcode之23. 合并K个升序链表(小根堆))