B 社《死亡迴圈》今日正式上線:IGN 等評分為滿分
阿新 • • 發佈:2021-09-17
題目連結:https://leetcode-cn.com/problems/split-linked-list-in-parts
題目描述:
給你一個頭結點為 head 的單鏈表和一個整數 k ,請你設計一個演算法將連結串列分隔為 k 個連續的部分。
每部分的長度應該儘可能的相等:任意兩部分的長度差距不能超過 1 。這可能會導致有些部分為 null 。
這 k 個部分應該按照在連結串列中出現的順序排列,並且排在前面的部分的長度應該大於或等於排在後面的長度。
返回一個由上述 k 部分組成的陣列。
題解:
/** * 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: vector<ListNode*> splitListToParts(ListNode* head, int k) { vector<ListNode*> result(k, nullptr); ListNode* p = head; int len = 0; while(p != nullptr) { p = p->next; len++; } int part = len / k; //平均每部分的長度 int remain = len % k; //剩餘的長度,急前remin部分的長度各+1 cout << len << endl; ListNode* curr = head; for(int i = 0; i < k && curr != nullptr; i++) { result[i] = curr; int partSize = part + ( i < remain ? 1 : 0); //每段長度 for(int j = 1; j < partSize; j++) { curr = curr->next; } ListNode* next = curr->next; curr->next = nullptr; curr = next; } return result; } };