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