Leetcode725. 分隔链表(C语言)
数据结构-链表:算法与数据结构参考
题目:
给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。返回一个符合下述规则的链表的列表。
- 每部分的长度应该尽可能的相等,可能有些部分为 null。
- k个部分按照链表中出现顺序输出
- 前面部分的长度 >= 后面的长度。
举例:
输入: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
输出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
思路:
构造存储列表的输出列表(二级指针)
计算出每部分长度,给每个子列表赋值
重点在于处理partlen和extra的关系
代码:
/**
* 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* root, int k, int* returnSize){
*returnSize = k;
int len;
struct ListNode* cur=root;
if(cur==NULL) len=0;
else for(len=1;cur=cur->next;len++);//算链表长度,计数必须避免改变root
int partlen=(len<=k)?1:(len/k); //计算每部分长度
int extra=(len<=k)?0:(len%k); //多出的平均分到前几个列表中
struct ListNode** plists=calloc(k,sizeof(struct ListNode*));
//存储多个列表的列表
cur=root;
struct ListNode* pnext=NULL;
for(int i=0;i<k;i++){
plists[i]=cur;
for(int j=0;(j<(partlen+(extra>0))) && cur;j++){
//必须确保extra>0的条件;否则子列表长度出错
pnext=cur; //保存最后一个分节点,用来切断
cur=cur->next;
}
if(pnext) pnext->next=NULL;
extra--; //extra可以小于0;
}
return plists;
}