1. 程式人生 > 其它 >前端基礎進階-JavaScript核心 DOM BOM操作-第一天課後作業

前端基礎進階-JavaScript核心 DOM BOM操作-第一天課後作業

725. 分隔連結串列

Difficulty: 中等

給定一個頭結點為 root 的連結串列, 編寫一個函式以將連結串列分隔為 k 個連續的部分。

每部分的長度應該儘可能的相等: 任意兩部分的長度差距不能超過 1,也就是說可能有些部分為 null。

這k個部分應該按照在連結串列中出現的順序進行輸出,並且排在前面的部分的長度應該大於或等於後面的長度。

返回一個符合上述規則的連結串列的列表。

舉例: 1->2->3->4, k = 5 // 5 結果 [ [1], [2], [3], [4], null ]

示例 1:

輸入: 
root = [1, 2, 3], k = 5
輸出: [[1],[2],[3],[],[]]
解釋:
輸入輸出各部分都應該是連結串列,而不是陣列。
例如, 輸入的結點 root 的 val= 1, root.next.val = 2, \root.next.next.val = 3, 且 root.next.next.next = null。
第一個輸出 output[0] 是 output[0].val = 1, output[0].next = null。
最後一個元素 output[4] 為 null, 它代表了最後一個部分為空連結串列。

示例 2:

輸入: 
root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
輸出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
解釋:
輸入被分成了幾個連續的部分,並且每部分的長度相差不超過1.前面部分的長度大於等於後面部分的長度。

提示:

  • root 的長度範圍:[0, 1000].
  • 輸入的每個節點的大小範圍:[0, 999].
  • k的取值範圍:[1, 50].

Solution

兩步走:

  1. 求得連結串列的長度length
  2. 計算k個部分中每個部分的長度int(length / k),前length%k個在此基礎上長度加1
# Definition for singly-linked list.
# class ListNode:
#   def __init__(self, x):
#     self.val = x
#     self.next = None
​
class Solution:
  def splitListToParts(self, root: ListNode, k: int) -> List[ListNode]:
    # 連結串列的長度
    tmp = root
    length = 0
    while tmp:
      tmp = tmp.next
      length += 1
    
    # 列表的前j個在i的基礎上加一
    i, j = int(length / k), length % k
    res = []
    if i == 0:
      for _ in range(k):
        if root:
          res.append(ListNode(root.val))
          root = root.next
        else:
          res.append(None)
    else:
      for l in range(1, k+1):
        # 前 k 個的子元素長度為i+1
        dummy = pre = ListNode(-1)
        if l <= j:
          for _ in range(i+1):
            pre.next = root
            root = root.next
            pre = pre.next
        else:
          for _ in range(i):
            pre.next = root
            root = root.next
            pre = pre.next
        pre.next = None
        res.append(dummy.next)
    return res