LeetCode 23 合併K個公升序鍊錶

2022-06-17 23:03:11 字數 3201 閱讀 5697

好久沒刷題了,這個困難的題目,果然還是需要對鍊錶的特性有一定的熟悉才好入手。

也是卡了好久,記錄一下題解大大的做法,後面會再二刷、三刷,一定要摸清這些題目的規律

給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。

請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。

示例 1:

輸入:lists = [[1,4,5],[1,3,4],[2,6]]

輸出:[1,1,2,3,4,4,5,6]

解釋:鍊錶陣列如下:

[ 1->4->5,

1->3->4,

2->6

]將它們合併到乙個有序鍊錶中得到。

1->1->2->3->4->4->5->6

示例 2:

輸入:lists = 

輸出:

示例 3:

輸入:lists = 

輸出:

方法一:hmm,不用過腦子的話,先想到的是將每個鍊錶內容都塞入陣列,排序後再轉鍊錶返回。

class solution(object):

def mergeklists(self, lists):

""":type lists: list[listnode]

:rtype: listnode

"""listarray =

for singlenode in lists:

while singlenode:

singlenode = singlenode.next

resnode = temnode = listnode(0)

listarray.sort(reverse=false) #sort 排序,false 從小到大

for temp in listarray:

temnode.next = listnode(temp)

temnode = temnode.next

return resnode.next

執行用時:80 ms, 在所有 python 提交中擊敗了86.79%的使用者

記憶體消耗:21.6 mb, 在所有 python 提交中擊敗了23.45%的使用者

還有乙個同樣的思路是轉dic,用key、value的形式去存鍊錶,通過dic.keys 返回list再用sort排序,最後再轉化整個鍊錶。

方法二:

分治,摘自題解大大的乙個。

分治的思想就是各自以中間點為分割比較,直至一方不存在,再合併到另乙個鍊錶。

# 邊界情況

if length == 0:

return none

if length == 1:

return lists[0]

# 分治

mid = length / 2

return self.merge(self.mergeklists(lists[:mid]), self.mergeklists(lists[mid:length]))

def merge(self, node_a, node_b):

dummy = listnode(none)

cursor_a, cursor_b, cursor_res = node_a, node_b, dummy

while cursor_a and cursor_b: # 對兩個節點的 val 進行判斷,直到一方的 next 為空

if cursor_a.val <= cursor_b.val:

cursor_res.next = listnode(cursor_a.val)

cursor_a = cursor_a.next

else:

cursor_res.next = listnode(cursor_b.val)

cursor_b = cursor_b.next

cursor_res = cursor_res.next

# 有一方的next的為空,就沒有比較的必要了,直接把不空的一邊加入到結果的 next 上

if cursor_a:

cursor_res.next = cursor_a

if cursor_b:

cursor_res.next = cursor_b

return dummy.next

方法三:還有乙個類似方法一的做法,就是通過python的乙個庫-->heapq來實現push和pop操作,其中彈出的元素為堆中最小的element

class solution(object):

def mergeklists(self, lists):

""":type lists: list[listnode]

:rtype: listnode

"""if not lists or len(lists) == 0:

return none

import heapq

heap =

# 首先 for 巢狀 while 就是將所有元素都取出放入堆中

for node in lists:

while node:

node = node.next

dummy = listnode(none)

cur = dummy

# 依次將堆中的元素取出(因為是小頂堆,所以每次出來的都是目前堆中值最小的元素),然後重新構建乙個列表返回

while heap:

cur.next = temp_node

cur = temp_node

print(heap)

return dummy.next

LeetCode 23 合併 K個排序序列

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 解題思路 採用分治的思想,將 k 個鍊錶的合併問題轉換成,合併 2 個有序鍊錶的問題 typedef struct listnode list 定...

Leetcode23 合併K個排序鍊錶

題目 解題思路 這道題使用的是分治演算法。首先還用輔助函式mergetwolists 用來合併兩個有序單鏈表,不申請額外的空間實現原地合併。如下 listnode mergetwolists listnode l1,listnode l2 else head nexthead while l1 nu...

leetcode 23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6分析 我想是k次歸併。時間複雜度是 k 1 nlogn。題目分析 本題首先將每個鍊錶的首元素取出,構建乙個最小堆。堆頂則為最小的元素,用最小元素所在...