タイトル説明
Kマージソートリスト、リストを返し組み合わせソート。アルゴリズムの複雑さを説明し、分析してください。
入力:
[
1-> 4 - > 5、
1-> 3-> 4、
2-> 6
]
出力:1-> 1-> 2-> 3-> 4-> 4-> 5-> 6
問題解決のためのアイデア
- 暴力:合併kはソートリストは、再帰的な問題に変換されるようにターンマージ2は、順序付きリスト
# 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:
def mergeTwoLists(l1,l2):
pre = ListNode(None)
head = pre
while l1 and l2:
if l1.val <= l2.val:
pre.next = l1
l1 = l1.next
pre = pre.next
else:
pre.next = l2
l2 = l2.next
pre = pre.next
pre.next = l1 if l1 else l2
return head.next
if not lists:
return
r = lists[0]
for i in range(1,len(lists)):
r = mergeTwoLists(r,lists[i])
return r
- 統治法:改善に暴力法に基づいて行われ、最終的には時間の複雑さを低減し、一緒に二十から二合併をマージしています
# 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:
def mergeTwoLists(l1,l2):
pre = ListNode(None)
head = pre
while l1 and l2:
if l1.val <= l2.val:
pre.next = l1
l1 = l1.next
pre = pre.next
else:
pre.next = l2
l2 = l2.next
pre = pre.next
pre.next = l1 if l1 else l2
return head.next
if not lists:
return
s = 1 #代表当前合并的两个链表的索引差
n = len(lists)
while s < n:
for i in range(0,n,2 * s):
if i + s <= n - 1:
lists[i] = mergeTwoLists(lists[i],lists[i + s])
s *= 2
return lists[0]
概要
- 質問は必ずブラシソリューションは唯一、暴力を考え出すことができないかもしれません感じるために、実際のアルゴリズムは、問題解決に適用される、給油継続する希望は、このアルゴリズムは、実際に問題解決に適用されます