1. 程式人生 > 實用技巧 >LeetCode725分隔連結串列

LeetCode725分隔連結串列

題目連結

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

題解

  • 這題我做了好久
  • 該題抽象出來的話,就是要將n個物體分成k組,要求每組物體數量的差異不超過1。
  • 思路就是先均分成k組,每組n/k(忽略小數位)個元素,剩下了n%k個物體,就把剩下的n%k個物體均分放入n%k個組(在本題中是前n%k個組)。
// Problem: LeetCode 725
// URL: https://leetcode-cn.com/problems/split-linked-list-in-parts/
// Tags: Linked List
// Difficulty: Medium

#include<vector>
using namespace std;

struct ListNode{
    int val;
    ListNode* next;
};

class Solution{
private:
    int getLen(ListNode* root){
        int len = 0;
        while(root != nullptr){
            len++;
            root = root->next;
        }
        return len;
    }

public:
    vector<ListNode*> splitListToParts(ListNode* root, int k) {
        vector<ListNode *> result;
        ListNode *temp = nullptr;
        // 遍歷求連結串列長度
        int n = this->getLen(root);
        // 每個part至少quotient個節點
        int quotient = n / k;
        // 剩餘remainder個節點,將其平均分配至前remainder個part
        int remainder = n % k;
        // 前remainder個part各quotient+1個節點,後k-remainder個節點各quotient個節點
        for (int i = 0; i < k; i++){
            // 儲存該part的頭結點
            result.push_back(root);
            // 該part中節點數量
            int partCount = remainder > 0 ? quotient + 1 : quotient;
            // 通過遍歷,將root移動到下一個part,同時用temp儲存該part的尾節點
            for (int j = 0; j < partCount; j++){
                temp = root;
                root = root->next;
            }
            // 斷開該part中尾節點與下一part的連線
            if (temp != nullptr)
                temp->next = nullptr;
            remainder--;
        }
        return result;
    }
};

作者:@臭鹹魚

轉載請註明出處:https://www.cnblogs.com/chouxianyu/

歡迎討論和交流!