Leecode23 合併k個排序鍊錶

2021-09-25 19:35:33 字數 1769 閱讀 4993

題目:

合併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(nlog⁡n)) ,其中 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(nlog⁡k)) ,其中 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...