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