725. Split Linked List in Parts

题目分析

原题链接,登陆 LeetCode 后可用
这道题目是让我们把一个链表分成 K 份,其中每两份之间的长度差不能大于 1。这道题首先要解决的问题是确定每一份的长度。思路也很简单。先用链表的长度整除份数 K,求出每份的基本长度。然后用链表的长度和份数 K 的余数。假设余数为 r,那么这个余数可以理解为其中有 r 份的长度需要在基本长度的基础上加 1。

两外我们要处理一种特殊情况。比如链表的长度要小于要分的份数。比如以下情况。

[1, 2]  K = 3
[]  K = 10

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode[] splitListToParts(ListNode root, int k) {
        
        ListNode res[] = new ListNode[k];
        if(root == null) {
            return res;
        }
        
        ListNode temp = root;
        int length = 1;
        while(temp.next != null) {
            temp = temp.next;
            length += 1;
        }
        
        // 计算出每份的基本长度和有多少份长度要加 1
        int l = length / k;
        int r = length % k;
        
        if( length < k) {
            l = 1;
            r = 0;
        }
            
        ListNode head = root;
        ListNode prev = root;
        temp = head;
        // 一共划分成 k 份
        res[0] = head;
        for(int j = 1; k > 1; k--, j++) {
            
            int pl = l;
            if(r > 0) {
                r--;
                // 确定这一份的真实长度
                pl += 1;
            }
            
            if(temp.next == null) {
                res[j] = null;
                continue;
            }
            
            for(int i = 0; i < pl - 1; i++){
                temp = temp.next;
                prev = prev.next;
            }
            temp = temp.next;
            prev.next = null;
            head = temp;
            prev = temp;
            res[j] = head;
        }
        
        return res;
    }
}

你可能感兴趣的:(725. Split Linked List in Parts)