给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。
每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。
这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。
返回一个由上述 k 部分组成的数组。
const res = new Array(k).fill(null)
if (head === null) {
return res
}
let count = 0
let cur = head
while(cur) {
count++
cur = cur.next
}
// 可能会分隔不平均,可能存在余量;
// 比如10个节点,分层3组,name第一组就需要多放一个节点(4,3,3)
let average = (count / k) | 0
let j = count % k
let Len = k
let pre = (cur = head)
while (k--) {
let i
if (j > 0) {
// 存在余量,前面的组要多加一个节点
i = average + 1
j--
} else {
// 不存在余量,或者已被分完
i = average
}
// 头节点cur不变,pre向后移动要分隔的位置
while (--i > 0 && pre) {
pre = pre.next
}
let next
if (pre) {
next = pre.next
pre.next = null
}
res[Len - (k + 1)] = cur
pre = cur = next
}
};