合併 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個鍊錶中取出乙個最小的...