[链表]leetcode725:分割链表(medium)

题目:
在这里插入图片描述
题解:

  • 模拟题,没有考察具体算法,所以直接按题目意思编写代码即可。
  • 思路:首先求出链表的长度,然后根据k来求得每段链表的平均长度,顺便求出余数。由于题目要求每部分长度相差不能超过1,而且排在前面的部分长度要大于后面部分的长度,所以我们根据余数的个数,给排在前面的部分长度+1。

代码如下:

class Solution {
public:
    //思路:先求出链表的长度,然后求出链表的平均长度,以及余数。由于题目规定任意两部分的长度不能超过1,所以余数依次给排在前面的平均长度+1即可
    vector<ListNode*> splitListToParts(ListNode* root, int k) {
        int size=0;
        ListNode *p=root;
        while(p){
            size++;
            p=p->next;
        }
        int avg_size=size/k,mod=size%k;
        vector<ListNode*> res(k,nullptr);
        ListNode *cur=root,*pre=nullptr;
        for(int i=0;i<k;++i)
        {
            res[i]=cur;
            //mod为0时,即使平均长度为0,cur为nullpre,不能实现断链了,即添加为nullptr
            int temp_size=mod?(avg_size+1):avg_size;
            while(temp_size--){
                pre=cur;
                cur=cur->next;
            }
            //pre为cur的前驱节点,也就是当前长度的最后一个节点,作用是实现断链
            if(pre)pre->next=nullptr;
            if(mod)mod--;
        }
        return res;
    }
};
发布了484 篇原创文章 · 获赞 149 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/103995776