题目
给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。
每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。
这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。
返回一个由上述 k 部分组成的数组。
示例 1:
输入:head = [1,2,3], k = 5
输出:[[1],[2],[3],[],[]]
解释:
第一个元素 output[0] 为 output[0].val = 1 ,output[0].next = null 。
最后一个元素 output[4] 为 null ,但它作为 ListNode 的字符串表示是 [] 。
分析
既然要分成k组,那么确认好每组的元素个数就可以了(总元素/k即可),因为不是均分,所以需要把余数(总元素%k)按照1分摊到每组里
public class LinkNode {int val;LinkNode next;public LinkNode(int data) {this.val = data;this.next = null;}
}
public class LinkList {LinkNode head;public LinkList() {this.head = null;}public LinkNode getHead() {return this.head;}//添加元素public void addNode(int data) {LinkNode node = new LinkNode(data);if (this.head == null) {this.head = node;} else {LinkNode cur = this.head;while(cur.next != null) {cur = cur.next;}cur.next = node;}}//正序打印public void print(LinkNode node) {while(node != null) {System.out.print(node.val);System.out.print(" ");node = node.next;}System.out.println();}public void split(int k) {int cnt = 0;LinkNode p = this.head;while(p != null) {cnt++;p = p.next;}int divRes = cnt / k;int divRest = cnt % k;p = this.head;LinkNode[] splitArray = new LinkNode[k];for(int i = 0;i<k && p != null;i++) {splitArray[i] = p;int tot = 0;if(i<divRest) {tot = divRes + 1;} else {tot= divRes;}for(int j = 1;j<tot;j++) {p = p.next;}LinkNode t = p.next;p.next = null;p = t;}for(int i = 0;i<k;i++) {LinkNode newHead = splitArray[i];print(newHead);}}
}
public class splitLinkedListinParts {public static void main(String[] args) {LinkList list = new LinkList();list.addNode(1);list.addNode(2);list.addNode(3);list.addNode(4);list.addNode(5);list.addNode(6);list.addNode(7);list.addNode(8);list.addNode(9);list.addNode(10);list.split(3);}
}