给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。
每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。
这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。
返回一个由上述 k 部分组成的数组。
? 示例 1:
输入:head = [1,2,3], k = 5 输出:[[1],[2],[3],[],[]] 解释: 第一个元素 output[0] 为 output[0].val = 1 ,output[0].next = null 。 最后一个元素 output[4] 为 null ,但它作为 ListNode 的字符串表示是 [] 。 示例 2:
?
输入:head = [1,2,3,4,5,6,7,8,9,10], k = 3 输出:[[1,2,3,4],[5,6,7],[8,9,10]] 解释: 输入被分成了几个连续的部分,并且每部分的长度相差不超过 1 。前面部分的长度大于等于后面部分的长度。
提示:
链表中节点的数目在范围 [0, 1000] 0 <= Node.val <= 1000 1 <= k <= 50
#include<iostream>
#include<vector>
using namespace std;
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) {
int count = 0; //链表长度
int divVal = 0;
int modVal = 0;
vector<ListNode*> split;
ListNode* cNode = head;
bool isSmall = false;
while (cNode != nullptr) {
cNode = cNode->next;
count++;
}
/* 如果链表节点数小于k */
if (count < k) {
isSmall = true;
}
/* 如果链表节点数大于k,计算一个整除数:divVal,一个余数:modVal */
else {
divVal = count / k;
modVal = count % k;
}
if (isSmall) {
ListSmallerThanK(head, split, k);
}
else {
ListBiggerThanK(head, split, divVal, modVal);
}
return split;
}
void ListSmallerThanK(ListNode* head, vector<ListNode*>& split, int count) {
int num = 0;
ListNode* lastNode = nullptr; /* 用于置空 */
while (head != nullptr) {
split.push_back(head);
lastNode = head;
head = head->next;
/* 一移动到下个节点,就置空 */
if (lastNode->next != nullptr) {
lastNode->next = nullptr;
}
num++;
}
while (num < count) {
split.push_back(nullptr);
num++;
}
}
void ListBiggerThanK(ListNode* head, vector<ListNode*>& split, int divVal, int modVal) {
int countdiv = 0;
ListNode* lastNode = nullptr; /* 用于置空 */
split.push_back(head);
while (head != nullptr) {
/* 每部分的长度差,不超过1,前面部分的长度大于等于后面部分的长度。 */
if (modVal > 0 && countdiv == (divVal + 1)) {
if (lastNode->next != nullptr) {
lastNode->next = nullptr;
}
split.push_back(head);
countdiv = 0;
modVal--;
}
/* 余数使用完之后,再继续按整除数push_back即可 */
else if (modVal == 0 && countdiv == divVal) {
if (lastNode->next != nullptr) {
lastNode->next = nullptr;
}
split.push_back(head);
countdiv = 0;
}
lastNode = head;
head = head->next;
countdiv++;
}
}
};
int main() {
ListNode* tail = new ListNode(1);
ListNode* head = tail;
for (int i = 2; i < 11; i++) {
tail->next = new ListNode(i);
tail = tail->next;
}
Solution* ps = new Solution();
vector<ListNode*> v = ps->splitListToParts(head, 3);
for (int i = 0; i < v.size(); i++) {
cout << v[i]->val << endl;
}
system("pause");
return 0;
}
|