网络异常,图片无法展示
|
给你一个头结点为 head
的单链表和一个整数 k
,请你设计一个算法将链表分隔为 k
个连续的部分。
每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。
这 k
个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。
返回一个由上述 k
部分组成的数组。
示例 1:
网络异常,图片无法展示
|
输入: head = [1,2,3], k = 5 输出: [[1],[2],[3],[],[]] 解释: 第一个元素 output[0] 为 output[0].val = 1 ,output[0].next = null 。 最后一个元素 output[4] 为 null ,但它作为 ListNode 的字符串表示是 [] 。 复制代码
示例 2:
网络异常,图片无法展示
|
输入: head = [1,2,3,4,5,6,7,8,9,10], k = 3 输出: [[1,2,3,4],[5,6,7],[8,9,10]] 解释: 输入被分成了几个连续的部分,并且每部分的长度相差不超过 1 。前面部分的长度大于等于后面部分的长度。 复制代码
提示:
- 链表中节点的数目在范围
[0, 1000]
0 <= Node.val <= 1000
1 <= k <= 50
本题要求把链表拆分为 k
个部分,这 k
个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度,且长度距离差不能超过 1
要把链表拆分符合题意的 k
个部分,则首先需要获取链表长度 len
有了链表长度 len
可以如下方式求得每一个部分的长度
- 首先最短的长度为
size = Math.floor(len/k)
- 然后需要有
len%k
个部分的长度为size+1
有了每一部分的长度后,只需要按相应长度截取链表中对应部分放入结果数组即可
动画演示如下:
网络异常,图片无法展示
|
代码如下:
var splitListToParts = function(head, k) { // 获取链表长度 let cur = head, len = 0; while(cur){ len++; cur = cur.next; } cur = head; // 获取每部分基础长度 const size = Math.floor(len/k), // 初始化结果数组 res = Array(k).fill(null); // 获取长度需要+1的部分的数量 let moreSize = len%k; for(let i = 0;i<k&&cur;i++){ // 将剩余部分的头节点放入结果数组 res[i] = cur; // 获取当前部分的长度 let itemSize = size; if(moreSize){ moreSize--; itemSize++; } // 获取当前部分的最后一个节点 while(itemSize>1){ cur = cur.next; itemSize--; } // 断开链表连接 const nextHead = cur.next; cur.next = null; // 更新cur指针 cur = nextHead; } // 返回结果数组 return res; }; 复制代码
至此我们就完成了 leetcode-725-分隔链表
如有任何问题或建议,欢迎留言讨论!