解题思路
-
先经过一轮遍历,统计出链表的长度
count; -
新建一个长度为
k的数组result = new Array(k),记录我们要返回的结果; -
对数组进行填充,每个数组的链表长度最少为
Math.floor(count / k),然后前面count % k个元素,每个长度加一。主要意思是,如果有8个元素,要分成3份,那么每个元素一开始初始长度都是2,这时候还残留2个待分配的节点,就在数组的前两位各加一; -
通过
map方法把数字改成链表的节点即可。
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode[]}
*/
var splitListToParts = function(head, k) {
// 一轮遍历计算出长度
let count = 0, cur = head;
while (cur) {
cur = cur.next;
count++;
}
// 结果中每个节点的长度
let result = new Array(k).fill(Math.floor(count / k));
// 平均分配完,有多的加到前面的节点
let over = count % k;
while (over > 0) {
result[over - 1]++;
over--;
}
// 根据各段的长度切割链表
return result.map(item => {
let newItem = head;
let cur = newItem;
// 一开始进来就是第一个节点了
while (item > 1) {
cur = cur && cur.next;
item--;
}
if (cur) {
const next = cur.next;
cur.next = null;
head = next;
}
return newItem;
});
};