[LeetCode]725. 分隔链表(java实现)

本文解析了LeetCode题目725,涉及如何根据给定节点数和分段数,平均分割链表并处理余数节点。通过Java代码展示了如何计算每段链表长度,以及如何正确地断开和合并链表。关键步骤包括计算每段平均长度、余数处理和链表分段操作。
摘要由CSDN通过智能技术生成

1. 题目

在这里插入图片描述

2. 读题(需要重点注意的东西)

  1. 返回的是一个存放着头节点的数组;
  2. l = len/ k为每组的长度
  3. r = len % k为余数
  4. 链表前面部分的长度应该大于后面部分的长度

思路:
用l表示每段的平均长度,如5个节点分为3段,5/3=1,平均长度为1,此时每段的长度分布为 : [[1],[1],[1]],但是1+1+1 = 3,总节点为5,因此余数为2也要加到每段中;用r表示余数,即有几段要加1,5%3=2,即前两段均要加1个节点,所以每段长度的分布为: [[1+1],[1+1],[1]] = [[2],[2],[1]]。
知道了每段的链表长度后,要执行的就只是断开链表的操作,以及要注意,有题目中所演示的 1->2->3->4, k = 5 // 5 结果 [ [1], [2], [3], [4], null ],返回有空的情况。

简而言之:1. 求每段长度;2. 分段。

3. 解法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
 // len % k = 余多少个节点,len / k = 每组的平均长度
 // pre节点用于在head节点前,断开链表,将链表分为不同的组
class Solution {
    public ListNode[] splitListToParts(ListNode head, int k) {
        ListNode[] ans = new ListNode[k]; // 创造最终返回的数组,有k个元素
        int len = 0;
        // 求链表长度的一种写法
        for(ListNode node = head;node != null;node = node.next) len++;
         // l表示每段的平均长度,如5个节点分为3段,5/3=1,平均长度为1,此时每段的长度分布为 : [[1],[1],[1]],但是1+1+1 = 3,总节点为5,因此余数为2也要加到每段中
        int l = len/ k;
        // r表示余数,即有几段要加1,5%3=2,即前两段均要加1个节点,所以每段长度的分布为: [[1+1],[1+1],[1]] = [[2],[2],[1]]
        int r = len % k;
        // 求出每段的长度后,要做的就只是在该分段的地方断开链表,然后存在数组中
        ListNode node = head;
        ListNode pre = null;
        for(int i = 0;i < k;i++, r--){
            ans[i] = node;
            // 每段的长度 part_len
            int part_len = l + (r > 0 ? 1 : 0);
            // 根据每段的长度断开链表
            for(int j = 0;j < part_len; j++){
                pre = node;
                node = node.next;
            }
            if(pre != null) pre.next = null;
        }
        return ans;
    }
}

4. 可能有帮助的前置习题

5. 所用到的数据结构与算法思想

6. 总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloudeeeee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值