leetcode725. 分隔链表(java)

分隔链表

题目描述

给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。

每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。

这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。

返回一个由上述 k 部分组成的数组。
示例1:

输入:head = 1,2,3, k = 5

输出:\[1,2,3,\[\],\[\]]

解释:

第一个元素 output0 为 output0.val = 1 ,output0.next = null 。

最后一个元素 output4 为 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

拆分链表

题目要求将给定的链表分隔成 kkk 个连续的部分。由于分隔成的每个部分的长度和原始链表的长度有关,因此需要首先遍历链表,得到链表的长度 nnn。

得到链表的长度 n 之后,记 quotient=⌊n / k⌋,remainder=n % k,则在分隔成的 k 个部分中,前 remainder个部分的长度各为 quotient+1,其余每个部分的长度各为 quotient。

分隔链表时,从链表的头结点开始遍历,记当前结点为 curr,对于每个部分,进行如下操作:

  1. 将curr 作为当前部分的头结点;
  2. 计算当前部分的长度 partSize;
  3. 将 curr向后移动 partSize步,则 curr为当前部分的尾结点;
  4. 当 curr 到达当前部分的尾结点时,需要拆分 curr 和后面一个结点之间的连接关系,在拆分之前需要存储 curr的后一个结点 next;
  5. 令 curr的 next 指针指向 nul,完成 curr 和 next 的拆分;
  6. 将 next赋值给 curr。

代码演示

java 复制代码
/**
 * 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; }
 * }
 */
class Solution {
      public ListNode[] splitListToParts(ListNode head, int k) {
        int n = 0;
        ListNode temp = head;
        while (temp != null) {
            n++;
            temp = temp.next;
        }
        int quotient = n / k, remainder = n % k;

        ListNode[] parts = new ListNode[k];
        ListNode curr = head;
        for (int i = 0; i < k && curr != null; i++) {
            parts[i] = curr;
            int partSize = quotient + (i < remainder ? 1 : 0);
            for (int j = 1; j < partSize; j++) {
                curr = curr.next;
            }
            ListNode next = curr.next;
            curr.next = null;
            curr = next;
        }
        return parts;
    }

}
相关推荐
guodingdingh36 分钟前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯2 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
GuWenyue2 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
优橙教育2 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵3 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
我叫洋洋4 小时前
C ++ [ hello world ]
c语言·c++·算法
腻害兔4 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影5 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
奋发向前wcx5 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
Miao121316 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言