原题链接:https://leetcode-cn.com/problems/split-linked-list-in-parts/
vector<ListNode*> splitListToParts(ListNode* root, int k) {
vector<ListNode*> ans;
ListNode *p=root;
int len=0;
while(p!=NULL){//先计算出链表长度
len++;
p=p->next;
}
p=root;
if(len<k){//如果长度比k小,直接分隔并且返回
while(p!=NULL){
ListNode *tmp=p;
p=p->next;
tmp->next=NULL;
ans.push_back(tmp);
}
int c=k-len;
while(c--){
ans.push_back(NULL);
}
return ans;
}
int x=len/k;//子链表长度
int y=len%k;//剩余的节点数
ListNode *q=root;
p=root;
while(p!=NULL){
int count=x;
while(count>1){
count--;
q=q->next;
}
if(y>0){//将剩余节点平均分配给前面的子链表
q=q->next;
}
ListNode *tmp=p;
p=q->next;
q->next=NULL;
q=p;
ans.push_back(tmp);
y--;
}
return ans;
}
改进
vector<ListNode*> splitListToParts(ListNode* root, int k) {
ListNode *p=root;
int len=0;
while(p!=NULL){
len++;
p=p->next;
}
vector<ListNode*> ans(k,NULL);//提前设置ans空间,并且初始化为NULL
int x=len/k;
int y=(k<=len)?len%k:0;//y是剩余节点,如果k>len,将没有剩余节点
ListNode *q=root;
p=root;
int i=0;
while(p!=NULL){
int count=x;
while(count>1){
count--;
q=q->next;
}
if(y>0){
q=q->next;
}
ListNode *tmp=p;
p=q->next;
q->next=NULL;
q=p;
ans[i++]=tmp;
y--;
}
return ans;
}