给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。

每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。

k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。

返回一个由上述 k 部分组成的数组。

 

示例 1:

输入:head = [1,2,3], k = 5
输出:[[1],[2],[3],[],[]]
解释:
第一个元素 output[0] 为 output[0].val = 1 ,output[0].next = null 。
最后一个元素 output[4] 为 null ,但它作为 ListNode 的字符串表示是 [] 。

示例 2:

输入:head = [1,2,3,4,5,6,7,8,9,10], k = 3
输出:[[1,2,3,4],[5,6,7],[8,9,10]]
解释:
输入被分成了几个连续的部分,并且每部分的长度相差不超过 1 。前面部分的长度大于等于后面部分的长度。

 

提示:

  • 链表中节点的数目在范围 [0, 1000]
  • 0 <= Node.val <= 1000
  • 1 <= k <= 50
Related Topics
  • 链表

  • 👍 173
  • 👎 0
  • 每日一题

    遍历一遍得到长度,然后除以k份,得到每份的长度,并除以k取模,得到前多少份需要往后额外取一位

    class Solution {
        int count = 0;
        ListNode[] res;
        int sliceCount = 0;
        int mold = 0;
        public ListNode[] splitListToParts(ListNode head, int k) {
            res = new ListNode[k];
            if (null == head){
                return res;
            }
            ListNode cp = head;
            while (cp != null){
                count++;
                cp = cp.next;
            }
            sliceCount = count/k;
            mold = count % k;
            cp = head;
            for (int i = 0; i < k; i++) {
                res[i] = cp;
                if(cp == null){
                    continue;
                }
                int count = 1;
                while (cp != null && count < sliceCount){
                    count++;
                    cp = cp.next;
                }
                if (mold > 0 && cp != null && count <=sliceCount){
                    mold--;
                    cp = cp.next;
                }
                if (cp != null){
                    ListNode tmp = cp;
                    cp = cp.next;
                    tmp.next = null;
                }
            }
    
            return res;
        }
    }