1. 程式人生 > 資訊 >B 社《死亡迴圈》今日正式上線:IGN 等評分為滿分

B 社《死亡迴圈》今日正式上線:IGN 等評分為滿分

題目連結: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;
    }
};