给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。
每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。
这k个部分应该按照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。
返回一个符合上述规则的链表的列表。
来源:力扣(LeetCode)
由题可知, 最大部分和其余部分差值为1
那应该有多少链表元素为最大长度?
由例题
元素个数为 10, k的值为3, 链表最长的个数为1, 共分段数为3, 最大长度为4, 其余为3
记元素个数为 cnt; 最大长度 maxpartSize, 其余为minpartSize
不难发现 maxpartSize = cnt / k + 1;minpartSize = cnt / k;
而最大链表个数 为 cnt (mod k)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
struct ListNode** splitListToParts(struct ListNode* head, int k, int* returnSize)
{
*returnSize = k;
struct ListNode **ans = (struct ListNode**)malloc (sizeof ( struct ListNode*) * k);
memset (ans, 0, sizeof ( struct ListNode*) * k);
int cnt = 0;
// 统计元素个数
struct ListNode *cur = head;
while (cur)
{
cur = cur -> next;
cnt ++;
}
int maxpartSize = cnt / k + 1;
int minpartSzie = cnt / k;
int reminder = cnt % k;
// 将 cur 重置
cur = head;
for (int i = 0; i < k&&cur != NULL; i ++)
{
ans[i] = cur;
// 计算当前情况下的链表长度
int partSize = i < reminder ? maxpartSize : minpartSzie;
for (int j = 1; j < partSize; j ++)
{
cur = cur -> next;
}
// 将符合条件的链表断开, 开启下一轮遍历
struct ListNode *after = cur -> next;
cur -> next = NULL;
cur = after;
}
return ans;
}