LeetCode 725. 分隔链表

文章介绍了如何使用C++实现一个算法,将给定的单链表按指定数量k进行分割,使得每部分长度尽可能相等且满足长度差不超过1的要求。算法首先计算链表节点数,然后根据节点数和k来确定每部分的长度,并通过迭代处理链表节点,确保分割正确。
摘要由CSDN通过智能技术生成

一、题目描述

给你一个头结点为 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

二、思路

先遍历得出节点个数,并计算好分隔后的每一块链表的长度,如果无法平均分则以从前到后的顺序让余数个的链表长度+1

三、算法代码实现

class Solution {
public:
    vector<ListNode*> splitListToParts(ListNode* head, int k) {
        int n=0;
        ListNode* count=head;
        //记录链表有多少个节点
        while(count){
            n++;
            count=count->next;
        }
        int per=n/k;//每份应该分成多大的规模
        //当链表长度小于k的数量时,默认每个数组长度为1
        if(n<k){
            per=1;
        }
        int rest=n%k;//余数刚好为前面需要+1个节点的块的个数
        ListNode* cur=head;
        vector<ListNode*>ans(k,nullptr);//创建一维数组,k列,且每一列都是空值
        for(int i=0;i<k&&cur;i++){
            ans[i]=cur;
            //让cur指针指向当前组的最后一个节点
            for(int j=0;j<per-1;j++){
                cur=cur->next;
            }
            //当n>k时,数组扩大一个单位的操作才有意义,判断当前数组是否需要扩大一个单位
            if(rest>0&&n>k){
                cur=cur->next;
                rest--;
            }
            ListNode* temp=cur->next;//断尾操作前保存cur的下一个节点,避免找不到
            //最后一组时不需要分隔
            cur->next=nullptr;
            cur=temp;
        }
        return ans;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值