Source: Merge K Sorted Lists

Merge k sorted linked lists and return it as one sorted list.

Example :

1 -> 10 -> 20
4 -> 11 -> 13
3 -> 8 -> 9

will result in

1 -> 3 -> 4 -> 8 -> 9 -> 10 -> 11 -> 13 -> 20

解題:

因為這題被分類在 Heaps and Maps 項下,理論上似乎是用 Heapsort 來解比較好,但筆者在寫題目時考量到對於連結串列 linked list 如要使用該方法須先使用額外的記憶體將所有 linked list 的值存出後再執行 sorting,似乎在速度上不見得會比較快。故筆者這題是用近似 divide and conquer 的方式,將個別 linked list 兩兩一組合併後先存進另一組陣列,等一整輪結束後再用相同方法合併,直到只剩下一個整合完成的 linked list 來執行輸出。最後沒發生TLE,那就不管它啦!

Code:

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

class Solution:
    # @param lst: list of linked list
    # @return the head node in the linked list
    def mergeKLists(self, lst):
        tempMerger = []
        while len(lst) + len(tempMerger) > 1:
            while len(lst) > 1:
                linklst1, linklst2 = lst.pop(), lst.pop()
                tempMerger.append(self.merger(linklst1, linklst2))
            while len(tempMerger) > 1:
                linklst1, linklst2 = tempMerger.pop(), tempMerger.pop()
                lst.append(self.merger(linklst1, linklst2))
            if lst:
                tempMerger.append(lst.pop())
        if lst:
            return lst.pop()
        return tempMerger.pop()
    
    def merger(self, linklst1, linklst2):
        curr1, curr2 = linklst1, linklst2
        if curr1.val > curr2.val:
            root = curr2
            curr2 = curr2.next
        else:
            root = curr1
            curr1 = curr1.next
        
        temp = root
        while curr1 and curr2:
            if curr1.val > curr2.val:
                temp.next = curr2
                curr2 = curr2.next
            else:
                temp.next = curr1
                curr1 = curr1.next
            temp = temp.next
        if curr1:
            temp.next = curr1
        else:
            temp.next = curr2
        return root

GitHub: GitHub

發表留言