• leetcode725. 分隔链表(java)


    题目描述

    给你一个头结点为 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
    在这里插入图片描述

    拆分链表

    题目要求将给定的链表分隔成 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。

    代码演示

    /**
     * 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;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    2022.11.1 英语背诵
    纯 Java 撸个后台管理系统,这框架用起来贼好
    【深度学习手记】使用DNN训练与CNN训练对数据集的要求不一样,为什么CNN网络训练输入的数据需要4维的
    18数藏解析
    从信源熵到互信息
    PM项目管理职责
    Vue-2.1scoped样式冲突
    用关键词获取店铺订单和物流
    c++ decltype
    秋招/考研复试-数据结构
  • 原文地址:https://blog.csdn.net/SP_1024/article/details/132907438