[題解]LeetCode 725. 分隔連結串列(C++)
阿新 • • 發佈:2021-09-22
題目
給你一個頭結點為 head 的單鏈表和一個整數 k ,請你設計一個演算法將連結串列分隔為 k 個連續的部分。
每部分的長度應該儘可能的相等:任意兩部分的長度差距不能超過 1 。這可能會導致有些部分為 null 。
這 k 個部分應該按照在連結串列中出現的順序排列,並且排在前面的部分的長度應該大於或等於排在後面的長度。
返回一個由上述 k 部分組成的陣列。
示例 1:
輸入:head = [1,2,3], k = 5 輸出:[[1],[2],[3],[],[]] 解釋: 第一個元素 output[0] 為 output[0].val = 1 ,output[0].next = null 。 最後一個元素 output[4] 為 null ,但它作為 ListNode 的字串表示是 [] 。
示例 2:
輸入:head = [1,2,3,4,5,6,7,8,9,10], k = 3
輸出:[[1,2,3,4],[5,6,7],[8,9,10]]
解釋:
輸入被分成了幾個連續的部分,並且每部分的長度相差不超過 1 。前面部分的長度大於等於後面部分的長度。
提示:
- 連結串列中節點的數目在範圍 [0, 1000]
- 0 <= Node.val <= 1000
- 1 <= k <= 50
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/split-linked-list-in-parts
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
思路
沒什麼難度的一題,先遍歷連結串列一遍得到連結串列長度n,把n分成k份等長的短連結串列存進陣列。根據任意兩部分長度差距不超過1和排在陣列前面的連結串列比後面的長,意思就是給陣列前\(n \% k\)個連結串列額外分配1個。寫的時候注意連結串列空節點的判定。
時間複雜度O(n),空間複雜度O(1)。
程式碼
/** * 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) { ListNode* ptr = head; int n = 0; while(ptr) { ++n; ptr = ptr->next; } vector<ListNode*> ans; int n1 = n/k; int n2 = n%k; ListNode* cur = head; for(int i = 0; i < k; ++i) { ans.push_back(cur); int j = 1; while(j < n1) { cur = cur->next; ++j; } if(cur) { if(i < n2 && j <= n1) cur = cur->next; ListNode* tmp = cur; if(cur) cur = cur->next; if(tmp && tmp->next) tmp->next = nullptr; } } return ans; } };