题目:
题解:
- 模拟题,没有考察具体算法,所以直接按题目意思编写代码即可。
- 思路:首先求出链表的长度,然后根据k来求得每段链表的平均长度,顺便求出余数。由于题目要求每部分长度相差不能超过1,而且排在前面的部分长度要大于后面部分的长度,所以我们根据余数的个数,给排在前面的部分长度+1。
代码如下:
class Solution {
public:
//思路:先求出链表的长度,然后求出链表的平均长度,以及余数。由于题目规定任意两部分的长度不能超过1,所以余数依次给排在前面的平均长度+1即可
vector<ListNode*> splitListToParts(ListNode* root, int k) {
int size=0;
ListNode *p=root;
while(p){
size++;
p=p->next;
}
int avg_size=size/k,mod=size%k;
vector<ListNode*> res(k,nullptr);
ListNode *cur=root,*pre=nullptr;
for(int i=0;i<k;++i)
{
res[i]=cur;
//mod为0时,即使平均长度为0,cur为nullpre,不能实现断链了,即添加为nullptr
int temp_size=mod?(avg_size+1):avg_size;
while(temp_size--){
pre=cur;
cur=cur->next;
}
//pre为cur的前驱节点,也就是当前长度的最后一个节点,作用是实现断链
if(pre)pre->next=nullptr;
if(mod)mod--;
}
return res;
}
};