【LeetCode】23. Merge k Sorted Lists

Leetcode23 傳送門

兩種解法:

1. 調用merge two sorted lists,一次merge兩個鏈表,直到全部merge爲一個鏈表。設每個鏈表長度爲n,共k個鏈表,時間復度通過兩數值的比較次數計算:2n+3n+4n+...+kn=n(\frac{k(k+1)}{2}-1)=O(nk^2),空間複雜度爲O(1)

2. 採用堆數據結構,將所有鏈表中的最小元素加入有序堆,當一個最小元素被加入結果鏈表後,將該最小元素所在鏈表的下一節點值加入該堆,直至堆爲空。插入過程最少查找時間複雜度爲O(log(k)),則整體時間複雜度爲O(nklog(k)),因爲一共nk個元素,每加入一個元素需要至少log(k)次比較操作。

3. 每次merge兩個鏈表,使鏈表總數成k\rightarrow \frac{k}{2}\rightarrow \frac{k}{4}\rightarrow ...\rightarrow 2\rightarrow 1下降,則每個循環鏈表長度成n\rightarrow 2n\rightarrow 4n\rightarrow ...\rightarrow 2^{log k}n上升,時間複雜度爲k\cdot n+\frac{k}{2}\cdot 2n+\frac{k}{4} \cdot 4n+...+2^{logk}n \cdot 1 = nk \cdot logk

Python源碼:

Runtime: 108 ms, faster than 48.52% of Python online submissions for Merge k Sorted Lists.

Memory Usage: 17.4 MB, less than 71.21% of Python online submissions for Merge k Sorted Lists.

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        if not lists:
            return None
        end = len(lists) - 1
        while(end > 0):
            begin = 0
            while begin < end:
                lists[begin] = self.merge2Lists(lists[begin], lists[end])
                begin += 1
                end -= 1
        return lists[0]
    
    def merge2Lists(self, l1, l2):
        dummy = ListNode(0)
        p = dummy
        while l1 != None and l2 != None:
            if l1.val < l2.val:
                p.next = l1
                l1 = l1.next
            else:
                p.next = l2
                l2 = l2.next
            p = p.next
        if l1 != None:
            p.next = l1
        elif l2 != None:
            p.next = l2
        return dummy.next

我的心路:

    又是一個不太Hard的Hard題。思路很直接,每次獲取當前所有node中值最小的node,加入返回序列的下一個,並將列表中此node賦值爲其下一節點,如果該節點爲空,則從列表中刪去該節點。在遍歷之前先刪去了列表中爲空的節點。該方法的時間複雜度按比較次數計算,總共有元素nk個,每添加一個元素到結果鏈表中,需要在k個無序元素中找出最小的——k-1次比較,然後在k個元素中查找該值所在位置——k/2次查找,整體時間複雜度爲O(nk^3),空間複雜度爲O(1)

Runtime: 3748 ms, faster than 10.15% of Python online submissions for Merge k Sorted Lists.

Memory Usage: 17.4 MB, less than 71.21% of Python online submissions for Merge k Sorted Lists.

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        dummy = ListNode(0)
        cur = dummy
        i = 0
        j = 0
        for i in range(len(lists)):
            if lists[j] == None:
                lists.pop(j)
                j -= 1
            j += 1
        while(lists):
            cur_vals = [node.val for node in lists]
            idx = cur_vals.index(min(cur_vals))
            cur.next = lists[idx]
            cur = cur.next
            lists[idx] = lists[idx].next
            if lists[idx] == None:
                lists.pop(idx)
        return dummy.next

 

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