#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);

这样就可以很好的处理长度不均匀且长度较长的在前的问题;

考虑下如果要求长度较长的子链表都要排在后面该怎么解决呢?