1. 程式人生 > >LeetCode 725 (Split Linked List in Parts)

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; } }