Leetcode 23 合併K個排序鍊錶

2021-09-25 02:44:17 字數 2484 閱讀 5178

題目

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。

示例:輸入:

[1->4->5,

1->3->4,

2->6

]輸出: 1->1->2->3->4->4->5->6

python3

# 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:

#暴力法 列表存入所有val ,公升序排序,列表轉為listnode形成新鍊錶

"""res=

for i in

range

(len

(lists)):

while lists[i]

!=none:

res.

(lists[i]

.val)

lists[i]

=lists[i]

.next #k*n

o(n)

res.

sort

() # o

(nlogn)

head=point=

listnode(0

)for i in res:

point.next=

listnode

(i) point=point.next #o(n

)return head.next

"""#優先佇列 優化暴力

#將所有的val存入優先佇列依次取出即可

import heapq

head=point=

listnode(0

) res=

for i in

range

(len

(lists)):

while lists[i]

: heapq.

(res,

(lists[i]

.val, i)

) lists[i]

= lists[i]

.next

while res:

#print

(res)

val, p = heapq.

(res)

point.next =

listnode

(val)

point = point.next

return head.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:

#優先佇列 +貪心

#取出k個排序鍊錶的第乙個 存入優先佇列,

#再取出排序鍊錶的第二個 存入優先佇列,依次進行

import heapq

head=point=

listnode(0

) res=

for i in

range

(len

(lists)):

if lists[i]

: heapq.

(res,

(lists[i]

.val, i)

) lists[i]

= lists[i]

.next

while res:

val, p = heapq.

(res)

point.next =

listnode

(val)

point = point.next

if lists[p]

: heapq.

(res,

(lists[p]

.val, p)

) lists[p]

= lists[p]

.next

return head.next

分治實現LeetCode 23題 合併K個排序鍊錶

紀念第一道沒有看題解做出來的困難題 分治思想 歸併排序實現合併k個排序鍊錶 由於是實現一連串已經排序的鍊錶,所以第一時間想到了歸併排序 又由於是實現多個鍊錶的總排序,為了減少時間複雜度又想到了分治思想,這一題中也就是二分法 做了這麼多天的題總算有點進步 class solution 結果陣列的頭結點...

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...