leetcode-725. 分隔連結串列
阿新 • • 發佈:2021-09-22
/** * Definition for singly-linked list. * 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: int getlistlen(ListNode* head){int n = 0; if(head==NULL) return n; while(head){ n++; head = head->next; } return n; } vector<ListNode*> splitListToParts(ListNode* head, int k) { vector<ListNode*> res; int len = getlistlen(head);// cout<<"len:"<<len<<endl; int n = len/k; int m = len%k; vector<int> lenlist(k,n); // 初始化有k個段落,每個段落的長度為n for(int i = 0; i < m; i++) // 將多餘的平均分配到前面的每個段落上面 lenlist[i]++; for(auto i:lenlist) cout<<i<<endl; ListNode* p = head; // p設為每個段落的起點 ListNode* q = head; // q遍歷陣列 int i = 0; while(i<lenlist.size()){ int cnt = 1; while(cnt<lenlist[i]&&q){ q = q->next; cnt++; } ListNode* tmp = q; // 儲存每個段落的最後一個節點,將末尾指向NULL if(q!=NULL) q = q->next; // 將q指向下一個段落的信起點 if(tmp!=NULL) tmp->next = NULL; res.push_back(p); // 將段落的加入 p = q; // 更新下一個段落的起點 i++; // 更新下一個陣列的長度 } return res; } };