解题分析
输入:head = [1,2,3], k = 5
输出:[[1],[2],[3],[],[]]
解释:
第一个元素 output[0] 为 output[0].val = 1 ,output[0].next = null 。
最后一个元素 output[4] 为 null ,但它作为 ListNode 的字符串表示是 [] 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/split-linked-list-in-parts
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
已知我们得到一个链表,想要交它分隔为N份, 情况1:需要被分隔的链表长度比k值小,我们需要进行补全 情况2: 被分隔的链表长度无法被均匀的分配
var splitListToParts = function(head, k) {
let n = 0;
let temp = head;
while (temp != null) {
n++;
temp = temp.next;
}
let quotient = Math.floor(n / k), remainder = n % k;
const parts = new Array(k).fill(null);
let curr = head;
for (let i = 0; i < k && curr != null; i++) {
parts[i] = curr;
let partSize = quotient + (i < remainder ? 1 : 0);
for (let j = 1; j < partSize; j++) {
curr = curr.next;
}
const next = curr.next;
curr.next = null;
curr = next;
}
return parts;
};
面试题 02.04. 分割链表
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你不需要 保留 每个分区中各节点的初始相对位置。
示例 1:
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
思路
从题面意思看来,就是比大小,创建两个栈空间,一个用来存放大于等于x的节点,一个用来存放小于x的节点, 最后得到两个被分隔好的链表,进行组装链接
// 链表
function partition(head, x) {
// 创建大小虚拟头节点
let big = new ListNode(0)
let small = new ListNode(0)
// 复制一份出来遍历
const smallHead = small
const bigHead = big
// 进行遍历
while (head!==null) {
if (head.val< x) {
small.next = head
small = small.next
}else {
big.next = head
big = big.next
}
head = head.next
}
// 清空
big.next = null;
// 进行连接
small.next = bigHead.next
return smallHead.next
}
```
```