链表中比较常规的一道题:取整,取余,双指针的应用
自己写的代码,有些长,但是运行4ms结束,超过100%
class Solution {
public:
vector<ListNode*> splitListToParts(ListNode* root, int k) {
vector<ListNode*> ans(k, nullptr);
if(!root) return ans;
int len = 0;
ListNode* temp = root;
while(temp){
len++;
temp = temp->next;
}
int len_k = len/k;
int num_plus = len%k;
ListNode* head = root; //当前的这一段的头节点
ListNode* prev = nullptr; //当前头节点的上一个节点
for(int i=0; i<num_plus; i++) {
ans[i] = head;
for(int j=0; j<len_k+1; j++) {
prev = head;
head = head->next;
}
prev->next = nullptr;
}
for(int i=num_plus; i<k; i++) {
ans[i] = head;
for(int j=0; j<len_k; j++) {
prev = head;
head = head->next;
}
prev->next = nullptr;
}
return ans;
}
};
参考简略的写法:主要是不用分开两个循环,以及链表长度的计算集中在一行代码上,比较简洁。
class Solution {
public:
vector<ListNode*> splitListToParts(ListNode* root, int k) {
int len = 0;
for(ListNode* head = root; head!=null; head = head->next) ++len;
vector<ListNode*> ans(k);
int l = len/k;
int r = len%k;
ListNode* head = root;
ListNode* prev = nullptr;
for(int i=0; i<k; i++, r--) {
ans[i] = head;
for(int j=0; j<l+(r>0); j++) {
prev = head;
head = head->next;
}
if(prev) prev->next = nullptr;
}
return ans;
}
};