1. 程式人生 > 實用技巧 >LeetCode 725 分割連結串列

LeetCode 725 分割連結串列

LeetCode 725 分割連結串列

https://leetcode-cn.com/problems/split-linked-list-in-parts/

模擬

挺煩的一道題!不是難在演算法上面,而是需要考慮很多特殊情況。先模擬分割連結串列試一下吧。思路都寫在註釋裡了。

class Solution {
public:
    vector<ListNode*> splitListToParts(ListNode* root, int k) {
        // 統計連結串列個數
        int len = 0;
        for (ListNode *p = root; p != nullptr; p = p->next)
            ++len;
        
        // 計算每段平均多長avg_len和餘下的節點數remain
        // 因為要求分割後的每個連結串列長度差不能超過1,所以餘下的節點數需要分配給前remain個連結串列
        int avg_len = len / k;
        int remain = len % k;
        vector<ListNode*> ans;
        ListNode *p = root;

        // 特例 - 當連結串列節點個數小於k時
        if (avg_len == 0) {
            while (k--) {
                ans.push_back(p);
                // 當餘下節點數還沒分配完畢時,需要分割連結串列;當餘下節點數分配完畢時,p為nullptr
                if (remain) {
                    ListNode *tmp = p->next;
                    p->next = nullptr;
                    p = tmp;
                    --remain;
                }
            }
            return ans;
        }

        // 當總的連結串列節點個數大於等於k時
        while (k--) {
            // 先數avg_len個節點
            int cnt = avg_len;
            ans.push_back(p);
            while (--cnt) p = p->next;

            // 如果餘下節點沒有分配完畢,則繼續分配
            if (remain) {
                p = p->next;
                --remain;
            }

            // 別忘了分割連結串列
            ListNode *tmp = p->next;
            p->next = nullptr;
            p = tmp;
        }
        return ans;
    }
};

看了一眼力扣官方提供的題解,程式碼行數確實比我的少,但是我好像沒怎麼看懂,還是自己寫的程式碼更好理解一點。