LEETCODE 725. Split Linked List in Parts 解题思路分析

题目大意:

分隔链表

给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。

每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。

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

返回一个符合上述规则的链表的列表。

举例: 1->2->3->4, k = 5 // 5 结果 [ [1], [2], [3], [4], null ]

示例 1:

输入: 
 root = [1, 2, 3], k = 5
输出: [[1],[2],[3],[],[]]
解释:
 输入输出各部分都应该是链表,而不是数组。
 例如, 输入的结点 root 的 val= 1, root.next.val = 2, \root.next.next.val = 3, 且 root.next.next.next = null。
 第一个输出 output[0] 是 output[0].val = 1, output[0].next = null。
 最后一个元素 output[4] 为 null, 它代表了最后一个部分为空链表。

示例 2:

输入: 
root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
输出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
解释:
输入被分成了几个连续的部分,并且每部分的长度相差不超过1.前面部分的长度大于等于后面部分的长度。

提示:

  • root 的长度范围: [0, 1000].
  • 输入的每个节点的大小范围:[0, 999].
  • k 的取值范围: [1, 50].

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=725

解题思路分析:

本题需要先计算出链表的节点个数count,然后将count分隔成为k组。由于题目明确提示了给出的k组元素不一定能够平均分配,因此,每组的个数应该是 count / k。对于剩余的部分,即:remain = count % k,应该将其平均分配到前 remain 组,也就是说前remain组的元素个数比其他组的个数多一个。

明确了分组条件之后,我们只要把每一组按照个数从链表中顺序取出即可。

实现代码:

ListNode mRoot;
public ListNode[] splitListToParts(ListNode root, int k) {
    // 将root保存至全局变量
    mRoot=root;
    // 统计链表的元素个数
    int count=0;
    while(root!=null){
        count++;
        root=root.next;
    }
    // 计算每一组的元素个数
    int perCount=count/k;
    // 计算剩余元素个数
    int remain=count%k;
    // 返回结果
    ListNode[] res = new ListNode[k];
    // 循环每一组
    for(int i=0;i<k;i++){
        // 当前组元素个数
        // 如果是前remain组,个数是perCount+1
        int maxCount=i<remain?perCount+1:perCount;
        // 取得当前组的根节点
        res[i]=help(maxCount);
    }
    return res;
}
// 取得每一组的链表
ListNode help(int count){
    // 如果当前组个数为0,返回空
    if(count==0) return null;
    // 新建当前节点,节点值为root节点的值
    ListNode n = new ListNode(mRoot.val);
    // 将root节点设置为其下一个节点
    mRoot=mRoot.next;
    // 递归求解当前节点的下一个节点
    n.next=help(count-1);
    // 返回当前节点
    return n;
}

本题解法执行时间为0ms。

Runtime: 0 ms, faster than 100.00% of Java online submissions for Split Linked List in Parts.

Memory Usage: 39.4 MB, less than 7.69% of Java online submissions for Split Linked List in Parts.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-725-split-linked-list-in-parts-解题思路分析/
此条目发表在leetcode分类目录,贴了, , , 标签。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。