分隔链表--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;
}
}