#leetcode725分隔链表
题目描述讲的比较清楚,就是需要将一个链表尽可能均等的平分,而如果无法平分的话,需要将多出来的部分分到长度较长的链表里,比如上面这个例子:
[1,2,3,4,5,6,7,8,9,10]
可以分成[1,2,3,4],[5,6,7],[8,9,10]长度较长的链表需要先出现,代码应该怎么写呢?
看下:
public ListNode[] splitListToParts(ListNode root, int k) { ListNode cur = root; int N = 0; while(cur != null) { cur = cur.next; N++; } int mod = N % k; int size = N / k; cur = root; ListNode[] nodes = new ListNode[k]; for(int i=0; cur != null && i) { nodes[i] = cur; int curSize = size + (mod -- >0 ? 1:0); for(int j=0;j ) cur = cur.next; ListNode next = cur.next; cur.next = null; cur = next; } return nodes; }
这个代码的做法是先遍历整个链表,拿到链表的总长度N,然后将N对k整除,取商和余数,余数就是需要增加的长度的部分,而商就是每个子链表应该具备的长度;
然后就是建立链表数组,让第一个数组元素等于链表的首节点,然后根据商的长度走多少步,之后每商步就断开连接就可以了。
这个代码的精彩的地方在于对题目中要求的“长度较长的应该先出现”的要求的处理。
它是用mod得到的余数每次往下走之前对步数进行判断和递减,也就是这句:int curSize = size + (mod -- >0 ? 1:0);
这样就可以很好的处理长度不均匀且长度较长的在前的问题;
考虑下如果要求长度较长的子链表都要排在后面该怎么解决呢?