題目:
合併k個排序鍊錶,返回合併後的排序鍊錶,請分析和描述演算法的複雜度。
示例:
輸入:
[ 1->4->5,
1->3->4,
2->6
]輸出: 1->1->2->3->4->4->5->6
解法一:(暴力求解):
1、首先建立乙個空列表temp,將用於合併的k個鍊錶全部存放到其中;
2、建立乙個空節點head,然後將列表中的元素排序後放入乙個接乙個放入鍊錶中;
3、最後返回head節點的next
複雜度分析
時間複雜度:o(nlogn)) ,其中 n 是節點的總數目。
# definition for singly_linked list:
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class solution:
def mergeklists(self, lists):
temp =
head = point = listnode(0)
for i in lists:
while i:
i = i.next
for i in sorted(temp):
point.next = listnode(i)
point = point.next
return head.next
結果:
執行用時 :132 ms, 在所有 python3 提交中擊敗了57.50% 的使用者
記憶體消耗 :18 mb, 在所有 python3 提交中擊敗了9.09%的使用者
解法二:(使用優先佇列)
1、比較k個節點(每個鍊錶的首節點),獲得最小值的節點;
2、將選中的節點接在最終有序鍊錶的後面。
時間複雜度分析:
時間複雜度: o(nlogk)) ,其中 k 是鍊錶的數目。
**
# definition for singly_linked list
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
import heapq
class solution(object):
def mergeklists(self, lists):
dummy = p = listnode(0)
head =
for i in range(len(lists)):
if lists[i]:
while head:
p.next = listnode(val)
p = p.next
lists[idx] = lists[idx].next
if lists[idx]:
return dummy.next
結果:
runtime: 112 ms, faster than 79.81% of python3 online submissions for merge k sorted lists.
memory usage: 17.2 mb, less than 29.96% of python3 online submissions for merge k sorted lists.
23 合併K個排序鍊錶
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 偷懶直接複製了以前的堆的 所有看上去長了點 class priorityqueue priority是設定優先順序 true為大根堆 false為...
23 合併K個排序鍊錶
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。採用分治法的思想,將 k 個排序鍊錶先合併為 k 2 個鍊錶。依次迴圈,直至合併為1個鍊錶為止。注意 從 k 到 k 2 時,如何定義索引,將每兩個鍊錶合併,而且必須符合奇數 偶數個鍊錶的情況。解決辦法 k n 1 2 list...
23 合併K個排序鍊錶
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 暴力法 將所有的節點放在乙個陣列中,然後對陣列排序,最後遍歷陣列,組建新的鍊錶。definition for singly linked list...