思考
题目给出:给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。
首先链表 要分 k 个部分,
- 其中有可能链表的长度可能小于 k ,少的部分需要用 null 填。
- 如果链表长度大于 k 那么就开始对链表分块,且每块的长度差距不超过1,排在前面的长度需要大于后面的长度。
解题思路
- 获取链表长度。
- 获取每个分隔链表的长度,和剩余的节点个数。
- 计算每个分隔链表,每分配一个分隔链表,查看是否还有剩余的节点个数,如果有取出一个放到分隔链表中。
代码
var splitListToParts = function(head, k) {
let len = 0, pre = head, result = [];
// 计算链表长度
while(pre) {
pre = pre.next;
len++
}
// 计算每个分隔链表长度
let itemLen = Math.floor(len / k);
// 计算剩余未分配的节点个数
let carry = len % k;
// 设置虚拟头节点,因为要操作头节点
let hair = new ListNode(-1, head);
for (let i = 0; i < k; i++) {
let pre = hair, num = itemLen;
while(num--) {
pre = pre.next;
}
if (carry-- > 0 && pre) pre = pre.next;
result.push(hair.next || null);
let next = pre.next || null;
pre.next = null;
hair.next = next;
}
return result;
};