725. 分隔链表
给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。
每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。
这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。
返回一个由上述 k 部分组成的数组。
思路:
1、分隔链表首先考虑的问题,链表分k个parts,每个部分有几个呢
- 我们将链表拆分之前,需要算一下链表的长度
- 然后通过
Math.floor(len/k)得到了每个部分至少有几个。 - 这里题目有个要求长度大的排在前面,这里要值得注意的是
len / k不一定被整除 所以假如10被分成了3份, 每份最小3
2、搞定的分组方案,我们就需要按分组放到数组长度为k的数组里 ,然后进行链表分隔 如下图:
var splitListToParts = function(head, k) {
const ans = Array(k).fill(null)
// len
let len = 0, cur = head;
while(cur){
len++
cur = cur.next
}
let parts = Math.floor(len / k), acounter = len % k
cur = head
for(let i = 0; i< k && cur; i++){
let partSize = parts + (i < acounter ? 1:0)
// 添加cur
ans[i] = cur
// 移动到分隔的位置
for(let j = 1; j < partSize; j++){
cur= cur.next
}
let next = cur.next
cur.next = null // 进行分隔
cur = next // cur指向下一个分隔的起始位置
}
return ans
};