这个题,有思路,简单的k >= length的情况 能处理,后面的有思路,代码捉急了,其实就是数组按照k段分,怎么分.
我的思路其实也行,就是后面我自己目前能力有限实现不了,我看了解析有个人思路跟我一样,写出来的代码太繁琐了,没有采用.又看了几个接着发现了下面这个思路我还能理解就比这先敲一遍
var splitListToParts = function (head, k) {
let length = 0;
let tmp = head;
// 计算总长度length
while (tmp) {
tmp = tmp.next;
length++;
}
// k(以3说明)段数组 每段的长度 8/3 每段按照最小 2个 分 233
const nodeLen = Math.floor(length / k);
// 有余数 8%3 余2 说明有2个 要多分1个
const remain = length % k;
let res = [];
// 从头部开始
let cur = head;
// 一共分为k 段
for (let i = 0; i < k; i++) {
// 先把链表装到res的值里面 后面开始处理链表cur
res[i] = cur;
// 计算每条链表的长度,将remain平均分给排在靠前的 以8&3余2为例 前面2个都要多分1个
let listLen = nodeLen + (remain > i ? 1 : 0);
// 开始分割前 listLen 个
while (listLen > 1) {
// 长度为listLen 要右移动 listLen次
// 例如 头部为1-2-3-4-...,前3个从1到3要移动2次
cur = cur.next;
listLen--;
}
// 如果cur还有值 就是cur的下个节点滞空并且后移 就是截断
// 为下一次循环做准备
if (cur) {
const temp = cur.next;
cur.next = null;
cur = temp;
}
}
return res;
};