合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。
示例:輸入:
[1->4->5,
1->3->4,
2->6
]輸出: 1->1->2->3->4->4->5->6
拿到題按照規矩,首先先暴力一遍,把拿到的資料全部放進陣列sort一下,然後放進乙個鍊錶
ps:太久沒有接觸鍊錶了,幾乎忘完了...寫next的時候還在用->next =-=
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class solution:
def mergeklists(self, lists: list[listnode]) -> listnode:
self.nodes =
head = point = listnode(0)
for l in lists:
while l:
l = l.next
for x in sorted(self.nodes):
point.next = listnode(x)
point = point.next
return head.next
時間用了224ms
接下來看看有沒有什麼省時間的演算法
首先,先試著分析只有兩個的鍊錶的時候
我去leetcode上面搜了一下,還真有這一題
將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。
示例:輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
既然是已經排序好的,那就先比較這兩個鍊錶的首個數字,比較出小的next,之後再次進行比較,選小的next一直迴圈下去
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class solution:
def mergetwolists(self, l1: listnode, l2: listnode) -> listnode:
head = listnode(0)
point = head
while l1 and l2:
if l1.val <= l2.val:
point.next = l1
l1 = l1.next
else:
point.next = l2
l2 = l2.next
point = point.next
if l1:
point.next = l1
else:
point.next = l2
return head.next
那麼放在k個鍊錶裡面,也可以採取這種方式,這裡用到了佇列這樣更加方面
from queue import priorityqueue
class solution(object):
def mergeklists(self, lists):
""":type lists: list[listnode]
:rtype: listnode
"""q = priorityqueue()
head = point = listnode(0)
for l in lists:
if l:
q.put((l.val,l))
while not q.empty():
val, node = q.get()
point.next = listnode(val)
point = point.next
node = node.next
if node:
q.put((node.val, node))
return head.next
花費的時間192ms,比暴力的時間稍微快一點
這個演算法是兩兩合併的演算法進行了優化。
不得不說,我做了那到合併兩個鍊錶的題目二也沒有想過通過一輪一輪的方法來做這道題,而是直接把合併兩個鍊錶的方法(不聽取最小的放在最後的鍊錶裡面)直接用了=-=
只能說太死腦筋啦,今天學習到了,**也貼在下面:
# definition for singly-linked list.
# class listnode(object):
# def __init__(self, x):
# self.val = x
# self.next = none
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
from queue import priorityqueue
class solution(object):
def mergeklists(self, lists):
""":type lists: list[listnode]
:rtype: listnode
"""len_of_lists = len(lists)
if len_of_lists == 0:
return
len_of_next = 1
while len_of_next < len_of_lists:
for i in range(0, len_of_lists - len_of_next, len_of_next*2):
lists[i] = self.merge2lists(lists[i], lists[i+len_of_next])
len_of_next *= 2
return lists[0]
def merge2lists(self, l1, l2):
head = point = listnode(0)
while l1 and l2:
if l1.val <= l2.val:
point.next = listnode(l1.val)
l1 = l1.next
else:
point.next = listnode(l2.val)
l2 = l2.next
point = point.next
if l1:
point.next = l1
else:
point.next = l2
return head.next
這道題用了三種方法,還進行了優化,感覺學到了很多,以後想問題的時候格局要大一點咯 刷題之合併K個排序鍊錶
題目 合併 k 個排序鍊錶,返回合併後的排序鍊錶。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 思路一 從21.合併兩個有序鍊錶的基礎上,我們已經能夠解決兩個有序鍊錶的問題,現在是k個有序鍊錶,我們可以將第一二個有序鍊錶進行合併,然後將新的有序鍊錶再繼續跟第三個有...
合併k個排序鍊錶
合併k個排序鍊錶,並且返回合併後的排序鍊錶。嘗試分析和描述其複雜度。樣例 給出3個排序鍊錶 2 4 null,null,1 null 返回 1 2 4 null 兩兩合併 合併ab得到c 合併cd得到e definition for listnode.public class listnode pu...
合併K個排序鍊錶
從21.合併兩個有序鍊錶的基礎上,我們已經能夠解決兩個有序鍊錶的問題,現在是k個有序鍊錶,我們可以將第一二個有序鍊錶進行合併,然後將新的有序鍊錶再繼續跟第三個有序鍊錶合併,直到將所有的有序鍊錶合併完成。這樣做思路上是可行的,但是演算法的時間複雜度將會很大,具體就不計算了。有興趣的自己計算下。根據思路...