Leetcode725. 分隔链表(C语言)

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;
}
发布了42 篇原创文章 · 获赞 0 · 访问量 609

猜你喜欢

转载自blog.csdn.net/jeanlu/article/details/104259462