Netty中ByteBuf記憶體洩露及釋放解析
阿新 • • 發佈:2020-12-20
23. 合併K個升序連結串列
Difficulty: 困難
給你一個連結串列陣列,每個連結串列都已經按升序排列。
請你將所有連結串列合併到一個升序連結串列中,返回合併後的連結串列。
示例 1:
輸入:lists = [[1,4,5],[1,3,4],[2,6]]
輸出:[1,1,2,3,4,4,5,6]
解釋:連結串列陣列如下:
[
1->4->5,
1->3->4,
2->6
]
將它們合併到一個有序連結串列中得到。
1->1->2->3->4->4->5->6
示例 2:
輸入:lists = [] 輸出:[]
示例 3:
輸入:lists = [[]]
輸出:[]
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i]
按 升序 排列lists[i].length
的總和不超過10^4
Solution
本題有一個標籤之一是分治,那就是要求我們把一個大的問題分解為小的問題,在21題給出了合併兩個有序連結串列的解法,對於K個有序連結串列則可以把K個有序連結串列分解成兩撥,然後逐個解決兩撥連結串列的合併問題。
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def mergeKLists(self, lists: List[ListNode]) -> ListNode: if not lists: return None if len(lists) == 1: return lists[0] # 分治 mid = len(lists) // 2 l, r = self.mergeKLists(lists[:mid]), self.mergeKLists(lists[mid:]) return self.merge(l, r) def merge(self, l, r): res = ListNode(-1) pre = res while l and r: if l.val <= r.val: pre.next = l l = l.next else: pre.next = r r = r.next pre = pre.next pre.next = l or r return res.next