Day26: [LeetCode中等] 725. 分隔链表
题源:
来自leetcode题库:
https://leetcode-cn.com/problems/split-linked-list-in-parts/
思路:
这道题代码很简单,思路上需要注意的是:怎么确定当前要分的vector的长度。如果你要是简单的用除法就会出问题,比如8个值分为三份,应该分为3,3,2。但是8/3=2,加上余下的2个就成了4,2,2。这显然不对。如果考虑把余下的两个变成1+1分配出去,就会把问题复杂化。
我的办法是:还是拿8个值分三份举例,先8/3=2,可见余数为2不为0,所以要分出2+1个值(若这里余数为0,则分出两个值)。完成第一次分数组后,8-3=5,因为要分的份数减一了,所以下一次就是就是5/2=2,余数为1不为0,要分出2+1个值,以此类推。
代码:
dirty code凑合看吧
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<ListNode*> splitListToParts(ListNode* root, int k) {
vector<ListNode*> res;
auto p=root;
int Len=0;
while(p){
Len++;
p=p->next;
}
if(k>=Len){
p=root;
while(p){
res.push_back(p);
auto temp=p;
p=p->next;
temp->next=NULL;
}
for(int i=0;i<k-Len;i++){
res.push_back(NULL);
}
}else{
auto pre=p=root;
int cishu=k;
for(int j=0;j<cishu;j++){
int l=Len/k,yu=Len%k;
if(yu!=0) {
l++;
res.push_back(p);
if(p!=root){
pre->next=NULL;
}
for(int i=0;i<l;i++){
pre=p;
p=p->next;
}
Len-=l;k--;
}else{
res.push_back(p);
if(p!=root){
pre->next=NULL;
}
for(int i=0;i<l;i++){
pre=p;
p=p->next;
}
Len-=l;k--;
}
}
}
return res;
}
};