Python實現合併K個公升序鍊錶

2021-10-18 19:29:44 字數 3261 閱讀 6710

給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。

請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。

輸入: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 將它們合併到乙...