725. 分隔链表
链表分解的话要让链表的末尾.next = null,这道题难度为中级可能只是结合了链表操作。
/**
* 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 {
/**
len =3 k=5 k = 3 3/ 5 = 0 3 %5=3 均摊到前3个
len =10 k=3 k = 3 10/3 = 3 10%3=1 均摊到前1个
这个实际上是把链表分片
*/
public ListNode[] splitListToParts(ListNode head, int k) {
ListNode[] res = new ListNode[k];
//第一部分 遍历得到链表长度
int len = 0;
ListNode p = head;
while(p !=null){
len++;
p = p.next;
}
// 第二部分 处理数据
int groupNums = len/k;
int leave = len%k;
ListNode pointer = head;
for(int i=0;i<k&&pointer!=null;i++){
//实现分摊 实际上是分摊到前 leave个
/**
leave = 3 分摊到0,1,2上
*/
res[i] = pointer;
int partSize = groupNums;
if(i<leave){
//如果在分摊范围内就进行分摊
partSize++;
}
for(int j =1;j<partSize;j++){
pointer=pointer.next;
}
//利用指针 让链表断开 当前pointer在断开节点的最后,不能丢下next,而且要砍断 当前.next = null
ListNode next = pointer.next;
pointer.next = null;
pointer = next;
}
return res;
}
}