前端基礎進階-JavaScript核心 DOM BOM操作-第一天課後作業
阿新 • • 發佈:2020-12-29
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
兩步走:
- 求得連結串列的長度length
- 計算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