1. 程式人生 > 實用技巧 >java進行PDF和圖片之間的相互轉換

java進行PDF和圖片之間的相互轉換

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