leetcode 23 合併K個排序鍊錶

2021-10-07 16:50:58 字數 2627 閱讀 2425

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

示例:

輸入:

[ 1->4->5,

1->3->4,

2->6

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

歸併法:

鍊錶兩兩合併,再兩兩合併

優先順序佇列:

先儲存所有head,排序,然後找最小的head,然後將最小的head的next二分插入有序的佇列中,重複直到隊列為空

歸併法:

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

merge_2lists

(self, list1:

list

, list2:

list)-

> listnode:

ret_head = listnode(-1

) p = ret_head

while list1 and list2:

if list1.val < list2.val:

p.next

= list1

list1 = list1.

next

else

: p.

next

= list2

list2 = list2.

next

p = p.

next

if list1:

p.next

= list1

if list2:

p.next

= list2

return ret_head.

next

defmergeklists

(self, lists: list[listnode])-

> listnode:

ifnot lists:

return

none

iflen

(lists)==1

:return lists[0]

mid =

len(lists)

>>

1return self.merge_2lists(self.mergeklists(lists[

:mid]

), self.mergeklists(lists[mid:])

)

優先順序佇列法:

# definition for singly-linked list.

class

listnode

(object):

def__init__

(self, x)

: self.val = x

self.

next

=none

class

solution

(object):

defmergeklists

(self, lists)

:"""

:type lists: list[listnode]

:rtype: listnode

"""ifnot lists:

return

candidates =

[head for head in lists if head]

candidates.sort(key =

lambda x: x.val)

init_head = listnode(-1

) p = init_head

while candidates:

cur_min = candidates.pop(0)

p.next

= cur_min

p = cur_min

to_insert = cur_min.

next

ifnot to_insert:

continue

low, high =0,

len(candidates)-1

while low <= high:

mid =

(low + high)//2

if candidates[mid]

.val < to_insert.val:

low = mid +

1elif candidates[mid]

.val > to_insert.val:

high = mid -

1else

: candidates.insert(mid, to_insert)

break

if low > high:

candidates.insert(low, to_insert)

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