제목 설명
K 병합 정렬 목록, 목록이 결합 된 소트 돌아갑니다. 기술과 알고리즘의 복잡성을 분석하십시오
입력 :
[
1-> 4 -> 5,
1-> 3-> 4,
2-> 6
]
출력 : 1-> 1-> 2-> 3-> 4 -> 4-> 5-> 6
문제 해결 아이디어
- 폭력 : 합병 k는 종류의 목록이 재귀 문제로 변환되도록 차례 병합 두,리스트를 정렬
# 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]
개요
- 질문은 항상 브러시 솔루션은, 폭력 가지고 올 수하지 않을 수 있습니다 느낌이 들어 진짜 알고리즘이 문제 해결에 적용, 연료를 계속 희망, 알고리즘은 실시간으로 문제 해결에 적용된다