0725. Split Linked List in Parts
Last updated
Last updated
**Input:** head = [1,2,3], k = 5
**Output:** [[1],[2],[3],[],[]]
**Explanation:**
The first element output[0] has output[0].val = 1, output[0].next = null.
The last element output[4] is null, but its string representation as a ListNode is [].**Input:** head = [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./**
* 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];
// edge cases
if (k == 0 || root == null) return res;
if (k == 1) {res[0] = root; return res;}
// count length
int len = 1;
ListNode r = root;
while (r.next != null) {
r = r.next;
len++;
}
int base = len / k, bonus = len % k;
ListNode dummy = new ListNode(0), tail = dummy;
dummy.next = root;
int index = 0;
while (dummy.next != null) {
// get base
for (int i = 0; i < base; i++) {
tail = tail.next;
}
// get bonus
if (bonus > 0) {
tail = tail.next;
bonus--;
}
// add to array
res[index++] = dummy.next;
dummy.next = tail.next;
tail.next = null;
tail = dummy;
}
return res;
}
}