分隔链表--java

给你一个头结点为 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 。前面部分的长度大于等于后面部分的长度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/split-linked-list-in-parts
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode[] splitListToParts(ListNode head, int k) {
        int n = 0;//用于记录head链表存在元素的长度变量
        ListNode cur = head; //存放head链表的新链表
        while(cur != null){//遍历求出数组中不为空的长度
            n++;
            cur=cur.next;//调用方法,遍历链表的下一个元素
        }
        int mod = n % k; //10%3=1为多余的部分
        int size = n / k;   //10除以3=3.333为平均长度
        ListNode [] res = new ListNode[k]; //新建k长度的链表
        cur = head;
        for(int i = 0;i < k&&cur != null;i++){//遍历将cur的链表元素依次存入到res链表数组中
            res[i]=cur;//遍历表数组res中元素指向cur链表
            int cursize = size + (mod--  > 0 ? 1 : 0);//平均长度+多出来的长度1为第一个res链表数组的长度,mod--先取mod值,再自减
            for(int j = 0;j < cursize - 1; j++){//根据平均长度和多余的部分来构成res每个数组的长度
                cur = cur.next;//遍历
            }
            ListNode next = cur.next;//把剩余的cur链表中数据给next链表
            cur.next = null;//把cur链表清空,相当于断开连接
            cur = next;//再把next链表数据给cur,把已经给res链表数组元素剔除
        }
        return res;
        
    }
}
posted @ 2021-10-09 21:43  网抑云黑胶SVIP用户  阅读(34)  评论(0编辑  收藏  举报