[LeetCode] 725. Split Linked List in Parts

原题链接:https://leetcode.com/problems/split-linked-list-in-parts/

1. 题目介绍

Given a (singly) linked list with head node root, write a function to split the linked list into k consecutive linked list “parts”.

The length of each part should be as equal as possible: no two parts should have a size differing by more than 1. This may lead to some parts being null.

The parts should be in order of occurrence in the input list, and parts occurring earlier should always have a size greater than or equal parts occurring later.

Return a List of ListNode’s representing the linked list parts that are formed.

给定一个单向链表及其根节点 root ,写一个函数分割这个链表。这个函数要把链表分割为 k 个连续的部分。每个部分的长度需要尽可能相等。任意两个部分的长度最多相差1. 有可能一些部分的长度是0, 这些部分的顺序需要按照原来链表的顺序排列。前面的部分的长度,需要大于或者等于后面部分的长度。

返回一个链表的数组,代表这个链表被分割的部分。数组中的每个元素,都是链表!
Examples 1->2->3->4, k = 5 // 5 equal parts [ [1], [2], [3], [4], null ]

Example 1:

Input: 
root = [1, 2, 3], k = 5
Output: [[1],[2],[3],[],[]]
Explanation:
The input and each element of the output are ListNodes, not arrays.
For example, the input root has root.val = 1, root.next.val = 2, \root.next.next.val = 3, and root.next.next.next = null.
The first element output[0] has output[0].val = 1, output[0].next = null.
The last element output[4] is null, but it's string representation as a ListNode is [].

Example 2:

Input: 
root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
Output: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
Explanation:
The input has been split into consecutive parts with size difference at most 1, and earlier parts are a larger size than the later parts.

Note:
The length of root will be in the range [0, 1000].
Each value of a node in the input will be an integer in the range [0, 999].
k will be an integer in the range [1, 50].

2. 解题思路

这个题目可以分为两步解决:
1 . 确定数组中第 i 个链表的长度,子链表的长度一共会有三种情况:
第一种: length / k 例如:

root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
Output: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
这里第23个元素都是长度为 10/3 = 3 的子链表

第二种:( length / k ) + 1 例如:

root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
Output: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
这里第一个元素是长度为 10/3 +1 = 3+1 = 4 的子链表

第三种: 0 例如:

root = [1, 2, 3], k = 5
Output: [[1],[2],[3],[],[]]45个元素都是长度为0的子链表

2 . 从root链表中截取相应长度的子链表放入数组

根据以上思路即可成功解决本题,具体的实现方法和说明,可以参考下面我的代码:
实现代码

class Solution {
    public ListNode[] splitListToParts(ListNode root, int k) {
        
        if(root == null){
        	return new ListNode[k];
        }
     
        //计算链表的总长度
        int length = Countlength(root);
     
        ListNode [] ans = new ListNode[k];
        int Remainder = length % k;
        int Quotient = length / k;
        
        ListNode cur = root;
        for(int i = 0; i<k ; i++){
      		//第i个链表的长度是sublength,它
      		//可能是length/k
      		//也可能是length/k + 1
      		//也可能是0
        	int sublength = 0;
        	if(Remainder != 0){
        		sublength = Quotient + 1;
        		Remainder--;
        	}else{
        		sublength = Quotient;
        	}
        	if(cur == null ){ 
        	//此种情况为k大于链表的长度时,cur已经走到了链表结尾
        	//此时第i个链表长度为0
        		ans[i] = null;
        		continue;
        	}
        	
        	//从总链表中截取sublength长度的链表作为第i个链表
        	ListNode temp = cur;
        	ListNode curPre = null;
        	for(int j = 0 ; j < sublength ; j++){
        		curPre = cur;
        		cur = cur.next;
        	}
            curPre.next = null;
        	ans[i] = temp;
        }
       
        return ans;
    }
    public int Countlength(ListNode root){
    	int length = 0;
    	ListNode cur = root;
    	while(cur != null){
    		length++;
    		cur = cur.next;
    	}
    	return length;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值