原題鏈接: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;
}