题目描述
- 题目
这k个部分应该按照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。
返回一个符合上述规则的链表的列表。
举例: 1->2->3->4, k = 5 // 5 结果 [ [1], [2], [3], [4], null ]
-
示例
-
示例 1:
输入: root = [1, 2, 3], k = 5 输出: [[1],[2],[3],[],[]] 解释: 输入输出各部分都应该是链表,而不是数组。 例如, 输入的结点 root 的 val= 1, root.next.val = 2, \root.next.next.val = 3, 且 root.next.next.next = null。 第一个输出 output[0] 是 output[0].val = 1, output[0].next = null。 最后一个元素 output[4] 为 null, 它代表了最后一个部分为空链表。
-
示例 2:
输入: root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3 输出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]] 解释: 输入被分成了几个连续的部分,并且每部分的长度相差不超过1.前面部分的长度大于等于后面部分的长度。
-
提示:
root 的长度范围: [0, 1000].
输入的每个节点的大小范围:[0, 999].
k 的取值范围: [1, 50].
解题
- 1.遍历链表获取l链表的长度 length;
- 2.length 除以 k 得到每段链表的平均长度 size 和 余数 mod,mod 的值决定了有多少个长度为 (size + 1) 的子链表排在前面。
- 如:length 长度为8 的链表要求被分割成3段
size = length/k,mod=length%k;(其中size=2,mod=2)
则有mod(2)个长度为size+1(3)的链表排在前面
- 解题动图
代码实现
class Solution {
public:
vector<ListNode*> splitListToParts(ListNode* root, int k) {
vector<ListNode*> ret(k,nullptr);
ListNode* cur=root;
int length=0;
while(cur){
length++;
cur=cur->next;
}
int size=length/k,mod=length%k;
cur=root;
ListNode* pre=nullptr;
for(int i=0;i<k;i++){
ret[i]=cur;//子链表的头结点存储
int len=mod>0?(size+1):size;
for(int j=0;j<len;j++){
//往子链表中添加len个结点
pre=cur;
cur=cur->next;
}
if(pre) pre->next=nullptr;
//将子链表的尾结点的next域置为空
if(mod) mod--;
}
return ret;
}
};