LeetCode725分隔連結串列
阿新 • • 發佈:2020-07-31
題目連結
https://leetcode-cn.com/problems/split-linked-list-in-parts/
題解
- 這題我做了好久
- 該題抽象出來的話,就是要將n個物體分成k組,要求每組物體數量的差異不超過1。
- 思路就是先均分成k組,每組n/k(忽略小數位)個元素,剩下了n%k個物體,就把剩下的n%k個物體均分放入n%k個組(在本題中是前n%k個組)。
// Problem: LeetCode 725 // URL: https://leetcode-cn.com/problems/split-linked-list-in-parts/ // Tags: Linked List // Difficulty: Medium #include<vector> using namespace std; struct ListNode{ int val; ListNode* next; }; class Solution{ private: int getLen(ListNode* root){ int len = 0; while(root != nullptr){ len++; root = root->next; } return len; } public: vector<ListNode*> splitListToParts(ListNode* root, int k) { vector<ListNode *> result; ListNode *temp = nullptr; // 遍歷求連結串列長度 int n = this->getLen(root); // 每個part至少quotient個節點 int quotient = n / k; // 剩餘remainder個節點,將其平均分配至前remainder個part int remainder = n % k; // 前remainder個part各quotient+1個節點,後k-remainder個節點各quotient個節點 for (int i = 0; i < k; i++){ // 儲存該part的頭結點 result.push_back(root); // 該part中節點數量 int partCount = remainder > 0 ? quotient + 1 : quotient; // 通過遍歷,將root移動到下一個part,同時用temp儲存該part的尾節點 for (int j = 0; j < partCount; j++){ temp = root; root = root->next; } // 斷開該part中尾節點與下一part的連線 if (temp != nullptr) temp->next = nullptr; remainder--; } return result; } };
作者:@臭鹹魚
轉載請註明出處:https://www.cnblogs.com/chouxianyu/
歡迎討論和交流!