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/

欢迎讨论和交流!


posted @ 2020-07-31 18:22  臭咸鱼  阅读(106)  评论(0编辑  收藏  举报