思想: 既然想要将原链表尽可能的均分为k段,那么可以先求出整个链表的长度,然后,如果当前链表的剩余长度能够整除k,那么每次从原链表中取(total / k) 个组成一段,如果不能整除,那么每次从每次从原链表中取(total / k + 1) 个组成一段(因为题目要求前面的段的长度要>=后面的段的长度,且各段的长度差不能超过1);然后令k–表示再把剩下的链表均分为k段即可。 最终,如果分割出的段数小于给定值,那么用null进行替代即可 时间复杂度O(N) ,空间复杂度O(N)
class Solution { public ListNode[] splitListToParts(ListNode root, int k) { List<ListNode> res = new ArrayList<>(); int totoalLen = 0,tempK = k; ListNode temp = root; while(temp!=null){ totoalLen++; temp = temp.next; } temp = root; while(temp!=null){ ListNode start = temp; int m = (totoalLen % k ==0)? (totoalLen / k):(totoalLen / k + 1); totoalLen-=m; k--; while((--m)>0){ temp = temp.next; } ListNode next = temp.next; temp.next = null; res.add(start); temp = next; } while(res.size()<tempK){ res.add(null); } return res.toArray(new ListNode[0]); } }