YSMull
<-- algorithm



原题链接

这个题要先计算链表的长度,然后根据 k,在遍历链表的过程中,每一次要剪断的长度是多少。

getNextPartLen 总是返回根据当前的剩余长度和剩余份数,剪断后第一段的长度是多少。

class Solution {
    public int getNextPartLen(int left, int k) {
        return (int) Math.ceil((float) left / k);
    }

    public int getLen(ListNode head) {
        if (head == null) return 0;
        return 1 + getLen(head.next);
    }

    public ListNode[] splitListToParts(ListNode root, int k) {
        ListNode[] res = new ListNode[k];
        int len = getLen(root);
        ListNode start = root;
        int cur = 0;
        while (cur < k) {
            int part = getNextPartLen(len, k - cur);
            if (start == null) {
                res[cur] = start;
            } else {
                // 找到尾巴,剪断,并更新下一个头结点
                // 此时保证一定可以遍历 part 次
                ListNode end = start;
                int m = 1;
                while (m < part) {
                    end = end.next;
                    m += 1;
                }
                res[cur] = start;
                start = end.next;
                end.next = null;
            }
            cur += 1;
            len -= part;
        }
        return res;
    }
}