主要思路
先计算出链表的长度len,然后len/k,商就是平均每组链表的长度余数为len%k = mod,如果为0说明每组长度正好一样,否则将前 mod个链表每组的长度都在原来的基础上加1即可。
struct ListNode
{
int val;
ListNode *next;
ListNode():val(0),next(nullptr){}
ListNode(int x):val(x),next(nullptr){}
ListNode(int x,ListNode *next):val(x),next(next){}
};
class Solution {
public:
vector<ListNode *> splitListToParts(ListNode *root, int k) {
vector<ListNode *> vec(k,nullptr);
if(root==nullptr)return vec;
ListNode *cur = root;
int len = 0;
while(cur) {//求链表长度
len++;
cur = cur -> next;
}
int width = len/k;//平均每组长度
int inc = len%k;//余数,前inc个链表的长度分别加1
ListNode *prev = root;
cur = root;
for(int i = 0;i<k;i++) {
vec[i] = cur;
int l = inc ? width + 1 : width;
while(l--) {//断链
prev = cur;
cur = cur->next;
}
if(prev)prev->next = nullptr;
if(inc)inc--;
}
return vec;
}
};