[725] 分隔链表(42)

90 阅读1分钟

这个题,有思路,简单的k >= length的情况 能处理,后面的有思路,代码捉急了,其实就是数组按照k段分,怎么分. image.png

我的思路其实也行,就是后面我自己目前能力有限实现不了,我看了解析有个人思路跟我一样,写出来的代码太繁琐了,没有采用.又看了几个接着发现了下面这个思路我还能理解就比这先敲一遍

var splitListToParts = function (head, k) {
	let length = 0;
	let tmp = head;
	// 计算总长度length
	while (tmp) {
		tmp = tmp.next;
		length++;
	}

	// k(以3说明)段数组 每段的长度 8/3 每段按照最小 2个 分 233
	const nodeLen = Math.floor(length / k);
	// 有余数 8%3 余2 说明有2个 要多分1个
	const remain = length % k;
	let res = [];
	// 从头部开始
	let cur = head;
	// 一共分为k 段
	for (let i = 0; i < k; i++) {
		// 先把链表装到res的值里面 后面开始处理链表cur
		res[i] = cur;

		// 计算每条链表的长度,将remain平均分给排在靠前的 以8&3余2为例 前面2个都要多分1个
		let listLen = nodeLen + (remain > i ? 1 : 0);
		// 开始分割前 listLen 个
		while (listLen > 1) {
			// 长度为listLen 要右移动 listLen次 
			// 例如 头部为1-2-3-4-...,前3个从1到3要移动2次
			cur = cur.next;
			listLen--;
		}

		// 如果cur还有值 就是cur的下个节点滞空并且后移 就是截断
		// 为下一次循环做准备
		if (cur) {
			const temp = cur.next;
			cur.next = null;
			cur = temp;
		}
	}

	return res;


};

力扣本题传送门