package CLinkedList;
import com.sun.org.apache.bcel.internal.generic.NEW;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/4/11 0011 13:03
*/
public class Problem725 {
//还没调试成功,不过基本就是这个速录
public ListNode[] splitListToParts(ListNode root, int k) {
//现获取链表的长度,然后计算每个部分应该分得几个
//链表的长度为 n 则 每部分应分得的
// perSegment = n/k;但是还剩下sub = n%k;
// 这sub应该分到钱sub中每个里面分一个
if(root==null) return null;
//1、获取链表的长度
ListNode temp = root;
int size = 0;
while(temp!=null){
size++;
temp=temp.next;
}
//每个部分应该分得的节点数
//每个部分应该分得的基础节点数
int perSegment = size/k;
//前sub个部分每个数组都多分一个节点 perSegment+1 1:sub
int sub = size%k;
//前sub个数组每个分得 perSegment+1个节点,之后的每个数组分得perSegment节点
ListNode[] rs = new ListNode[k];
//从第一个节点开始
temp = root;
int index =0;
int indexInArray =0;
//前sub个数组每个数组分perSegment+1节点
for(int i=0;i<sub;i++){
ListNode newHead = null;
ListNode newHeadTemp=null;
if(perSegment+1>=1){
newHead= temp;
newHeadTemp= newHead;
index++;
}
//每个数组分得perSegment+1个节点
if(index<perSegment+1){
newHeadTemp.next=temp.next;
temp=temp.next;
newHeadTemp = newHeadTemp.next;
index++;
}else{
newHeadTemp.next=null;
rs[indexInArray++]=newHead;
index=0;
}
}
//从sub到k每个分perSegment节点
for(int i=sub;i<k;i++){
ListNode newHead = null;
ListNode newHeadTemp=null;
if(perSegment>=1){
newHead= temp;
newHeadTemp= newHead;
index++;
}
//每个数组分得perSegment+1个节点
if(index<perSegment){
newHeadTemp.next=temp.next;
temp=temp.next;
newHeadTemp = newHeadTemp.next;
index++;
}else{
newHeadTemp.next=null;
rs[indexInArray++]=newHead;
index=0;
}
}
return rs;
}
//题目给出的标准答案
public ListNode[] splitListToParts1(ListNode root, int k) {
ListNode cur = root;
int N = 0;
while (cur != null) {
cur = cur.next;
N++;
}
//切分链表
int width = N / k, rem = N % k;
ListNode[] ans = new ListNode[k];
cur = root;
for (int i = 0; i < k; ++i) {
ListNode head = cur;
for (int j = 0; j < width + (i < rem ? 1 : 0) - 1; ++j) {
if (cur != null) cur = cur.next;
}
if (cur != null) {
ListNode prev = cur;
cur = cur.next;
prev.next = null;
}
ans[i] = head;
}
return ans;
}
public static void main(String[] args) {
ListNode head = new ListNode(1);
ListNode b = new ListNode(2);
ListNode c = new ListNode(3);
ListNode d = new ListNode(4);
head.next=b;
b.next=c;
c.next=d;
Problem725 problem725 = new Problem725();
problem725.splitListToParts(head,5);
}
}
LeetCode725 分隔链表(平均切分链表)
最新推荐文章于 2022-03-29 16:44:51 发布