LeetCode:725 分隔链表

113 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

题目

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

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

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

返回一个由上述 k 部分组成的数组。

示例 1:

img

输入:head = [1,2,3], k = 5
输出:[[1],[2],[3],[],[]]
解释:
第一个元素 output[0] 为 output[0].val = 1 ,output[0].next = null 。
最后一个元素 output[4] 为 null ,但它作为 ListNode 的字符串表示是 []

示例 2:

img

输入: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. 首先遍历链表,判断链表一共有多少个节点 number
  2. 根据 number / k 算出每个数组中存放多少个连续节点
  3. 因为存在部分链表的比另外一部分链表的多一个节点,我们通过 number - k * length 得出
  4. 根据最终的数量,分割链表存入数组即刻

代码

/**
 * 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 number = 0;
        ListNode countNode = head;
        while (countNode != null) {
            countNode = countNode.next;
            number++;
        }
        // 每个数组多少个节点
        int length = number / k;
        // 需要加 1 的数组
        int addtional = number - k * length;
        ListNode[] result = new ListNode[k];
        int resultIndex = 0;
        while (head != null) {
            int size = length + (addtional-- > 0 ? 1 : 0);
            if (size > 0) {
                ListNode newHeadNode = head;
                while (--size > 0) {
                    head = head.next;
                }
                ListNode temp = head;
                head = head.next;
                temp.next = null;
                result[resultIndex++] = newHeadNode;
            }
        }
        return result;
    }
}

总结

性能分析

  • 执行耗时:0 ms,击败了 100.00% 的 Java 用户
  • 内存消耗:41.5 MB,击败了 40.75% 的 Java 用户