Leetcode 23 python 合并K个排序链表

题意:

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

方法一:

首先将每个list里面的第一个元素,也就是每个list的最小元素(因为list都是已排序),共K个指放入大小为K的堆中,将其维护成最小堆结构。每次将堆顶的元素,也就是最小元素放到结果中,然后取出该元素原先所处的list中的下一个元素放入堆中,维护最小堆结构。当所有元素读取完,所有的元素就按照从小到大放到结果链表中。
注:
1.堆分为两种,大根堆和小根堆是一颗每一个节点的键值都不小于(大于)其孩子节点的键值的树。无论是大根堆还是小根堆(前提是二叉堆)都可以看成是一颗完全二叉树。
2.heap = [] #创建了一个空堆
heapq.heapify(a) #调整a,使得其满足最小堆
heappush(heap,item) #往堆中插入一条新的值
item = heappop(heap) #从堆中弹出最小值

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """

        heap = []           #创建堆
        #将每个链表中的第一个元素加入对中,并维护成最小堆的形式
        for ln in lists:
            if ln:
                heap.append((ln.val, ln))  #添加元素值与索引
        
        dummy = ListNode(0) #返回最终结果
        cur = dummy         #不断补充链表
        heapq.heapify(heap)  #维护成最小堆形式
        while heap:
            valu, ln_index = heapq.heappop(heap)  #弹出最小值和相应的索引值
            cur.next = ln_index
            cur = cur.next
            #取出该元素原先所处的list中的下一个元素放入堆中
            if ln_index.next:
                heapq.heappush(heap, (ln_index.next.val, ln_index.next))
        return dummy.next

你可能感兴趣的:(leetcode,python)