LeetCode 725 (Split Linked List in Parts)

1.描述:
給定一個 連接的ListNode:

  public class ListNode {
      int val;
      ListNode next;
      ListNode(int x) { val = x; }
  }

和一個正數 k. 將鏈接的 ListNode 劃分成 k 塊。每一塊包含ListNode的個數爲:連接的兩塊個數只差不超過1,且總是前面的 ListNode塊長度要不小於後面的鏈接塊長度。餘下的ListNode塊個數可以爲 null。

2.例子:
(1)例子1:
輸入:
root = [1, 2, 3], k = 5
輸出: [[1],[2],[3],[],[]]
(2)例子2:
輸入:
root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
輸出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]

3.代碼及解釋:

/**
 * 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) {
        int len = getLen(root);
        int partSize = len/k;
        int rem = len % k;
        //每一塊的長度
        int [] parLen = new int[k];
        for(int i = 0; i < k; i++){
            parLen[i] = partSize;
            if(rem != 0){
                parLen[i]++;
                rem--;
            }
            System.out.println(i+": " + parLen[i]);
        }
        //res 爲結果
        ListNode [] res = new ListNode[k];
        for(int i = 0; i < k; i++){
            res[i] = root;
            root = getNextRoot(root, parLen[i]);
        }
        return res;
    }

    //輸入 的鏈接 ListNode的長度
    public int getLen(ListNode root){
        int len = 0;
        while(root != null){
            root = root.next;
            len++;
        }
        return len;
    }

    //得到下一個 root 的起點。這裏注意 Java句柄的用法 
    public ListNode getNextRoot(ListNode root, int size){
        if(root == null) return null;
        while(root != null && size-1 != 0){
            root = root.next;
            size--;
        }
        ListNode res = root;
        if(res != null) res = res.next;
        if(root != null) root.next = null;
        return res;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章