【LeetCode每天一題】 Merge k Sorted Lists(合並K個有序鏈表)
阿新 • • 發佈:2019-04-06
span 排序。 mar lex 代碼 poi div 設置 第一個
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
【LeetCode每天一題】 Merge k Sorted Lists(合並K個有序鏈表)