[23]合并K个升序链表

  1 # 给你一个链表数组,每个链表都已经按升序排列。
  2 #
  3 #  请你将所有链表合并到一个升序链表中,返回合并后的链表。
  4 #
  5 #
  6 #
  7 #  示例 1:
  8 #
  9 #  输入:lists = [[1,4,5],[1,3,4],[2,6]]
 10 # 输出:[1,1,2,3,4,4,5,6]
 11 # 解释:链表数组如下:
 12 # [
 13 #   1->4->5,
 14 #   1->3->4,
 15 #   2->6
 16 # ]
 17 # 将它们合并到一个有序链表中得到。
 18 # 1->1->2->3->4->4->5->6
 19 #
 20 #
 21 #  示例 2:
 22 #
 23 #  输入:lists = []
 24 # 输出:[]
 25 #
 26 #
 27 #  示例 3:
 28 #
 29 #  输入:lists = [[]]
 30 # 输出:[]
 31 #
 32 #
 33 #
 34 #
 35 #  提示:
 36 #
 37 #
 38 #  k == lists.length
 39 #  0 <= k <= 10^4
 40 #  0 <= lists[i].length <= 500
 41 #  -10^4 <= lists[i][j] <= 10^4
 42 #  lists[i] 按 升序 排列
 43 #  lists[i].length 的总和不超过 10^4
 44 #
 45 #  Related Topics 链表 分治 堆(优先队列) 归并排序 👍 1554 👎 0
 46 
 47 
 48 # leetcode submit region begin(Prohibit modification and deletion)
 49 # Definition for singly-linked list.
 50 
 51 
 52 class ListNode:
 53     def __init__(self, val=0, next=None):
 54         self.val = val
 55         self.next = next
 56 
 57 
 58 class HeapQ:
 59 
 60     def __init__(self):
 61         self.rq = []
 62         self.size = 0
 63 
 64     def push(self, node: ListNode):
 65         """
 66         添加新元素到最后
 67         从最后位置开始上浮
 68         """
 69         self.rq.append(node)
 70         self.size += 1
 71         self.swim(self.size - 1)
 72 
 73     def swim(self, i):
 74         """
 75         上浮
 76         """
 77         if i != 0:
 78             parent = (i - 1) // 2
 79             if parent >= 0 and self.rq[i].val < self.rq[parent].val:
 80                 self.exchange(parent, i)
 81                 self.swim(parent)
 82 
 83     def exchange(self, i, j):
 84         self.rq[i], self.rq[j] = self.rq[j], self.rq[i]
 85 
 86     def sink(self, i):
 87         """
 88         下沉
 89         """
 90         left = 2 * i + 1
 91         right = 2 * i + 2
 92         if left <= self.size - 1 and self.rq[left].val < self.rq[i].val:
 93             self.exchange(left, i)
 94             self.sink(left)
 95         if right <= self.size - 1 and self.rq[right].val < self.rq[i].val:
 96             self.exchange(right, i)
 97             self.sink(right)
 98 
 99     def pop(self):
100         """
101         元素0和最后一个互换
102         删除元素0
103         最后一个元素开始下沉
104         :return:
105         """
106         if self.size != 0:
107             self.exchange(0, -1)
108             node = self.rq.pop(-1)
109             self.size -= 1
110             self.sink(0)
111             return node
112 
113 
114 class Solution:
115     def mergeKLists(self, lists: List[ListNode]) -> ListNode:
116         dummy = ListNode(-1)
117         pointer = dummy
118         hq = HeapQ()
119         for l in lists:
120             if l:
121                 hq.push(l)
122         while hq.size:
123             node = hq.pop()
124             pointer.next = node
125             pointer = node
126             if node.next:
127                 hq.push(node.next)
128         return dummy.next

 

posted @ 2021-10-21 18:00  小熊猫不是小浣熊  阅读(20)  评论(0)    收藏  举报