1、題目描述
https://leetcode-cn.com/problems/merge-k-sorted-lists/
合併 k 個排序鏈表,返回合併後的排序鏈表。請分析和描述算法的複雜度。
2、代碼詳解
2.1、合併k個排序數組(分治)
題目鏈接:https://www.lintcode.com/problem/merge-k-sorted-arrays/description
# O(N log k) 的時間複雜度內完成: N 是所有數組包含的整數總數量。 k 是數組的個數。
# 採用歸併排序算法, 拆解到最後,實際變成兩個數組進行排序
# 請牢記傳入的參數是多維數組
def MergeSort(nums):
# 此處是遞歸結束條件
if len(nums) <= 1:
return nums
# 取中間位置
mid = len(nums) // 2
# 此處實現遞歸
# 記住此處得到的也是多維數組
Left = MergeSort(nums[:mid])
Right = MergeSort(nums[mid:])
# print(Left[0], Right[0])
# 要傳入的參數是數組中第一個索引處的值
return Sort_list(Left[0], Right[0]) # 合併
def Sort_list(Left, Right):
res = [] # 存儲排序後的值
a = 0 # 遊標a,Left數組的第一個元素
b = 0 # 遊標b,Right數組的第一個元素
while a < len(Left) and b < len(Right):
if Left[a] < Right[b]:
res.append(Left[a])
a += 1
else:
res.append(Right[b])
b += 1
# 因爲存在一個到終點後,另一個還沒到終點
# 這時就需要將沒到終點的剩下的值添加到數組中
while a < len(Left):
res.append(Left[a])
a += 1
while b < len(Right):
res.append(Right[b])
b += 1
#將一維數組二維化
res = [res]
return res
if __name__ == '__main__':
b = MergeSort([[1, 2, 3],
[2, 3, 5],
[6, 7, 9],
[7, 8, 9],
[3, 5, 6]])
#print(b)
#數組降維
a = []
for i in b[0]:
a.append(i)
#print(a)
2.2、合併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:
if not lists:return
n = len(lists)
return self.merge(lists, 0, n-1)
def merge(self,lists, left, right):
if left == right:
return lists[left]
mid = left + (right - left) // 2
l1 = self.merge(lists, left, mid)
l2 = self.merge(lists, mid+1, right)
return self.mergeTwoLists(l1, l2)
def mergeTwoLists(self,l1, l2):
if not l1:return l2
if not l2:return l1
if l1.val < l2.val:
l1.next = self.mergeTwoLists(l1.next, l2)
return l1
else:
l2.next = self.mergeTwoLists(l1, l2.next)
return l2
還有使用堆的解法,待續