每日算法 -- 链表
725. 分隔链表
分析
- 暴力解法就是在第一次遍历过程中,单纯就是求长度,没有做任何处理
- 然后根据长度来求得分割的每一个的长度
- 由于可以分处 null 的节点,所以 res 的长度肯定是 k,所以需要判断当长度为0,或者cur 已经走完的时候,直接返回 null
// 725. 分隔链表
// https://leetcode-cn.com/problems/split-linked-list-in-parts/
/**
* @分析 -- 暴力
* 1. 先求出链表长度,然后分割链表
* 2. 根据不同的情况进行分隔,如果链表走完,即 count 为 0的时候,直接返回 null 即可
*/
var splitListToParts = function (root, k) {
let len = 0
let cur = root
while (cur) {
cur = cur.next
len++
}
let min = 0 // 最少有 min 个节点
let left = 0 // 前面 left 个节点有 min+1 个节点
if (len < k) {
// 代表有长度为 k 的数组,前 k 个分别是单个节点的
left = k
} else {
// 前 left 个节点有 min+1 个节点,剩下的有 min 个节点
min = Math.floor(len / k)
left = len % k
}
let res = []
cur = root
while (k--) {
// 当前分割节点的长度为 count
let count = min
if (left > 0) {
// 还处于多出来的情况
count = min + 1
}
if (count === 0 || !cur) {
// 如果值为 0,这个时候 left 肯定也没了
res.push(null)
} else {
let temp = cur
while (--count) {
cur = cur.next
}
let next = cur.next
cur.next = null
res.push(temp)
cur = next
left--
}
}
return res
};
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情