1. 程式人生 > 其它 >[題解]LeetCode 725. 分隔連結串列(C++)

[題解]LeetCode 725. 分隔連結串列(C++)

題目

給你一個頭結點為 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;
    }
};