725. Split Linked List in Parts

Medium
Given a (singly) linked list with head node root, write a function to split the linked list into k consecutive linked list “parts”.

The length of each part should be as equal as possible: no two parts should have a size differing by more than 1. This may lead to some parts being null.

The parts should be in order of occurrence in the input list, and parts occurring earlier should always have a size greater than or equal parts occurring later.

Return a List of ListNode’s representing the linked list parts that are formed.

Examples 1->2->3->4, k = 5 // 5 equal parts [ [1], [2], [3], [4], null ]
Example 1:

Input: 
root = [1, 2, 3], k = 5
Output: [[1],[2],[3],[],[]]
Explanation:
The input and each element of the output are ListNodes, not arrays.
For example, the input root has root.val = 1, root.next.val = 2, 
\root.next.next.val = 3, and root.next.next.next = null.
The first element output[0] has output[0].val = 1, output[0].next = null.
The last element output[4] is null, but it's string representation as a 
ListNode is [].

Example 2:

Input: 
root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
Output: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]

Explanation:
The input has been split into consecutive parts with size difference at most 1, and earlier parts are a larger size than the later parts.

Note:

The length of root will be in the range[0, 1000].
Each value of a node in the input will be an integer in the range [0, 999].
k will be an integer in the range [1, 50].

contest的一道题,一直卡在了不知道如何分配每组元素个数上,实际上分配方式很巧妙。比如[1,2,3,4,5,6,7], k = 3,分成[[1,2,3],[4,5,],[6,7]], 先计算每组最小长度int lenEach = len / k, 这里就是7/3 = 2. 然后看余数reminder = len % k, 这里余1, 那么我们就只需要在第一组2个元素的分段的尾部再加上一个元素就好了。如果余2, 比如[1,2,3,4,5,6,7,8] k = 3, 就要分成[[1,2,3],[4,5,6],[7,8]],这时候余数就是2,所以要把前面2组每组2个元素的尾部都再接上一个元素。其实就是把余数拿来一个一个分。

/**
 * 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 = 0;
        ListNode curt = root;
        while (curt != null){
            curt = curt.next;
            len++;
        }
        curt = root;
        int lenEach = len / k;
        int reminder = len % k;
        ListNode[] res = new ListNode[k];
        for (int i = 0; i < k; i++){
            ListNode dummy = new ListNode(-1);
            ListNode head = dummy;
            int num = 0;
            while (num < lenEach){
                head.next = new ListNode(curt.val);
                curt = curt.next;
                head = head.next;
                num++;
            }
            if (reminder > 0){
                head.next = new ListNode(curt.val);
                head = head.next;
                curt = curt.next;
     
                reminder--;
            }
            res[i] = dummy.next;
        }
        return res;
    }
}


    原文作者:greatfulltime
    原文地址: https://www.jianshu.com/p/c17083ca6d51
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞