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个组)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// 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/

欢迎讨论和交流!