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/
欢迎讨论和交流!