leetcode合併K個排序鍊錶

2021-10-03 19:55:59 字數 2142 閱讀 5780

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。

示例:輸入:

[1->4->5,

1->3->4,

2->6

]輸出: 1->1->2->3->4->4->5->6

直接上**:

class

solution

(object):

defmergeklists

(self, lists)

:"""

:type lists: list[listnode]

:rtype: listnode

"""list1=

l1=l2=listnode(0)

for i in lists:

while i:

i=i.

next

for j in

sorted

(list1)

: l1.

next

=listnode(j)

l1=l1.

next

return l2.

next

這個思路是把所有的節點值存到乙個列表裡面,然後對列表排序,再把列表的值加入到新的鍊錶中。

還有一種思路,用優先佇列解決

class

solution

:def

mergeklists

(self, lists:

[listnode])-

> listnode:

k=len(lists)

heap=

pre=listnode(0)

#用於構成返回鍊錶的頭節點

cur=pre

node=listnode(0)

#用於訪問lists的頭節點

for i in

range

(k):

node.

next

=lists[i]

while node.

next

: node = node.

next

#存入堆的元素只能是數值,不能是鍊錶的節點,所以是node.val

while heap:

#拿出元素

cur.

next

=listnode(b)

#將返回的int型變數轉換為鍊錶的結點型,然後不斷先後

cur=cur.

next

return pre.

next

還有一種思路,兩兩合併:

class

solution

:def

judge

(self, l1, l2)

: head = point = listnode(0)

while l1 and l2:

if l1.val <= l2.val:

point.

next

= l1

l1 = l1.

next

point=point.

next

else

: point.

next

= l2

l2 = l2.

next

point=point.

next

point.

next

= l1 if l1 else l2

return head.

next

defmergeklists

(self, lists: list[listnode])-

> listnode:

l =len(lists)

if l==0:

return

temp=lists[0]

for i in

range(1

, l)

: temp= self.judge(temp, lists[i]

)return temp

不過這種演算法效率太低,可以改進一下,將步長改為2,不斷將合併後的兩兩鍊錶繼續合併。

leetcode 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 方法1 暴力法 將所有鍊錶元素放入乙個陣列中,再對陣列排序,最後返回乙個排好序的鍊錶,但是似乎時間和記憶體會超,無法通過 複雜度取決於排序占用的複...

leetcode題庫 合併k個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 definition for singly linked list.struct listnode class solution if p val q ...

LeetCode題目 合併K個排序鍊錶

合併k個排序鍊錶是我在刷leetcode的時候遇到的題目,描述大致如下 合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 一開始的思路是類似於合併兩個有序鍊錶的思路,就是每次在這k個鍊錶中取出乙個最小的...