給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。
請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。
輸入:lists = [[1,4,5],[1,3,4],[2,6]]輸出:[1,1,2,3,4,4,5,6]
解釋:鍊錶陣列如下:
[1->4->5,
1->3->4,
2->6
]將它們合併到乙個有序鍊錶中得到。
1->1->2->3->4->4->5->6
輸入:lists =輸出:
輸入:lists =前面我們實現過2個公升序鍊錶的合併,k個鍊錶的合併其實就是2個鍊錶合併的公升級版。定義乙個最終的鍊錶,先合併第乙個和第二個,然後再合併第三…輸出:
from typing import list
class
listnode
:def
__init__
(self,val=0,
next
=none):
ifisinstance
(val,
int)
: self.val = val
self.
next
=next
elif
isinstance
(val,
list):
self.val = val[0]
self.
next
=none
head = self
for i in val[1:
]:node = listnode(i,
none
) head.
next
= node
head = head.
next
class
solution
:def
mergeklists
(self, lists: list[listnode])-
> listnode:
defmergetwolists
(a: listnode, b: listnode)
: merge = listnode(-1
) head = merge
while a and b:
if a.val > b.val:
head.
next
= b b = b.
next
else
: head.
next
= a a = a.
next
head = head.
next
head.
next
= a if a else b
return merge.
next
iflen
(lists)==0
:return
none
res =
none
for i in
range(0
,len
(lists)):
res = mergetwolists(res,lists[i]
)return res
lists =[[
1,4,
5],[
1,3,
4],[
2,6]
]l_nodes =
for l in lists:
listnode = listnode(l)
solution = solution(
)merge = solution.mergeklists(l_nodes)
while merge:
print
(merge.val)
merge = merge.
next
在使用順序合併的時候存在很多重複的操作,從而導致合併的時間會很長,其實我們可以先將整個鍊錶分成兩大塊,然後再繼續切分,最後分到左邊和右邊的鍊錶長度為1時,再往上進行合併
)參考:合併k個排序鏈
合併K個公升序鍊錶
給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 1 輸入 lists 1,4,5 1,3,4 2,6 輸出 1,1,2,3,4,4,5,6 解釋 鍊錶陣列如下 1 4 5,1 3 4,2 6 將它們合併到乙個有序鍊錶中得到。1 1 2 3 ...
23 合併K個公升序鍊錶
給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 1 輸入 lists 1,4,5 1,3,4 2,6 輸出 1,1,2,3,4,4,5,6 解釋 鍊錶陣列如下 1 4 5,1 3 4,2 6 將它們合併到乙個有序鍊錶中得到。1 1 2 3 ...
合併K個公升序鍊錶20201225
2.優化的優先佇列 3.兩兩合併 給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 1 輸入 lists 1,4,5 1,3,4 2,6 輸出 1,1,2,3,4,4,5,6 解釋 鍊錶陣列如下 1 4 5,1 3 4,2 6 將它們合併到乙...