LeetCode 725 (Split Linked List in Parts)
阿新 • • 發佈:2019-02-05
1.描述:
給定一個 連線的ListNode:
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
和一個正數 k. 將連結的 ListNode 劃分成 k 塊。每一塊包含ListNode的個數為:連線的兩塊個數只差不超過1,且總是前面的 ListNode塊長度要不小於後面的連結塊長度。餘下的ListNode塊個數可以為 null。
2.例子:
(1)例子1:
輸入:
root = [1, 2, 3], k = 5
輸出: [[1],[2],[3],[],[]]
(2)例子2:
輸入:
root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
輸出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
3.程式碼及解釋:
/**
* 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 len = getLen(root);
int partSize = len/k;
int rem = len % k;
//每一塊的長度
int [] parLen = new int[k];
for(int i = 0; i < k; i++){
parLen[i] = partSize;
if(rem != 0){
parLen[i]++;
rem--;
}
System.out.println(i+": " + parLen[i]);
}
//res 為結果
ListNode [] res = new ListNode[k];
for(int i = 0; i < k; i++){
res[i] = root;
root = getNextRoot(root, parLen[i]);
}
return res;
}
//輸入 的連結 ListNode的長度
public int getLen(ListNode root){
int len = 0;
while(root != null){
root = root.next;
len++;
}
return len;
}
//得到下一個 root 的起點。這裡注意 Java控制代碼的用法
public ListNode getNextRoot(ListNode root, int size){
if(root == null) return null;
while(root != null && size-1 != 0){
root = root.next;
size--;
}
ListNode res = root;
if(res != null) res = res.next;
if(root != null) root.next = null;
return res;
}
}