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;
}
}