歸併排序-LeetCode23. 合併K個排序鏈表

1、題目描述

https://leetcode-cn.com/problems/merge-k-sorted-lists/

合併 個排序鏈表,返回合併後的排序鏈表。請分析和描述算法的複雜度。

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

https://leetcode-cn.com/problems/merge-k-sorted-lists/solution/leetcode-23-he-bing-kge-pai-xu-lian-biao-by-powcai/

還有使用堆的解法,待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章