給定一個頭結點爲 root 的鏈表, 編寫一個函數以將鏈表分隔爲 k 個連續的部分。java
每部分的長度應該儘量的相等: 任意兩部分的長度差距不能超過 1,也就是說可能有些部分爲 null。數組
這k個部分應該按照在鏈表中出現的順序進行輸出,而且排在前面的部分的長度應該大於或等於後面的長度。ide
返回一個符合上述規則的鏈表的列表。函數
舉例: 1->2->3->4, k = 5 // 5 結果 [ [1], [2], [3], [4], null ]spa
示例 1:code
輸入:
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:it
輸入:
root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
輸出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
解釋:
輸入被分紅了幾個連續的部分,而且每部分的長度相差不超過1.前面部分的長度大於等於後面部分的長度。io
提示:class
root 的長度範圍: [0, 1000].
輸入的每一個節點的大小範圍:[0, 999].
k 的取值範圍: [1, 50].List
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode[] splitListToParts(ListNode root, int k) { int n = 0; ListNode cur = root; while(cur != null){ n++; cur = cur.next; } int mod = n % k; int size = n / k; ListNode [] res = new ListNode[k]; cur = root; for (int i = 0; i < k && cur != null; i++){ res[i] = cur; int cursize = size + (mod-- > 0 ? 1 : 0); for (int j = 0; j < cursize - 1; j++){ cur = cur.next; } ListNode next = cur.next; cur.next = null; cur = next; } return res; } }