【LeetCode每天一題】 Merge k Sorted Lists(合並K個有序鏈表)


Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:Input:

[
  1->4->5,
  1->3->4,
  2->6
]
Output: 1->1->2->3->4->4->5->6

思路

  這道題最簡單的方法就是我們將K個鏈表中的所有數據都存進數組中,然后對數據進行排序。排序完畢之后在依此對數組中的數據進行鏈表的構造。時間復雜度為O(n log n),n 是鏈表元素的總和。
  第二種思路是我們我們可以將列表中兩個鏈表兩個鏈表進行合並,直到最后合並完只剩下一條鏈表,就是排序之后的鏈表。時間復雜度為O(Nlog k)(N是總的元素數),空間復雜度為O(1)。
第二種圖示

第一種方法的解決代碼

 1 class Solution(object):  2     def mergeKLists(self, lists):  3         """
 4  :type lists: List[ListNode]  5  :rtype: ListNode  6         """
 7         self.nodes = []  8         head = point = ListNode(0) # 設置哨兵節點  9         for l in lists: # 循環遍歷列表中每一個鏈表,將元素添加進數組。 10             while l: # 將當前鏈表中的元素進行添加 11  self.nodes.append(l.val) 12                 l = l.next 13         for x in sorted(self.nodes): # 將排序之后的數組中的元素,構造鏈表。 14             point.next = ListNode(x) 15             point = point.next 16         return head.next

第二種方法的解決代碼


 

 1 class Solution(object):  2     def mergeKLists(self, lists):  3         """
 4  :type lists: List[ListNode]  5  :rtype: ListNode  6         """
 7         amount = len(lists)          # 計算出K的數值
 8         interval = 1                        # 間距
 9         while interval < amount:    # 先從間距1開始合並,
10             for i in range(0, amount - interval, interval * 2): 11                 lists[i] = self.merge2Lists(lists[i], lists[i + interval])   # 使用兩個鏈表的合並函數進行合並。
12             interval *= 2        # 當上一次間距合並完之后,將間距擴大為2倍。
13         return lists[0] if amount > 0 else lists      # 當列表鏈表數大於0時,返回第一個鏈表(排序好的鏈表)。
14  
15     def merge2Lists(self, l1, l2):         # 兩個鏈表進行合並成一個鏈表。
16         head = point = ListNode(0)       # 設置哨兵節點
17         while l1 and l2: 18             if l1.val <= l2.val: 19                 point.next = l1 20                 l1 = l1.next 21             else: 22                 point.next = l2 23                 l2 = l1 24                 l1 = point.next.next 25             point = point.next 26         if not l1:                            # 其中一個鏈表不為空,就將其添加到后面。
27             point.next=l2 28         else: 29             point.next=l1 30         return head.next


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM