第33天--算法(Leetcode 148)
148.排序链表
public ListNode sortList(ListNode head) { ListNode cur = head; int length = 0; while(cur != null) { cur = cur.next; length ++; } ListNode h = head; ListNode teamFirst = head; ListNode teamLast = null; for(int eachLen = 1;eachLen < length;eachLen <<= 1) { while(teamFirst != null) { ListNode ht[] = hthtn(teamFirst,eachLen); ListNode m[] = merge(ht[0],ht[1],ht[2],ht[3]); if(h == teamFirst) { h = m[0]; teamLast = m[1]; }else { teamLast.next = m[0]; teamLast = m[1]; } teamFirst = ht[4]; } teamFirst = h; teamLast = null; } return h; } public ListNode[] hthtn(ListNode teamFirst,int eachLen) { ListNode l1 = teamFirst; ListNode r1 = teamFirst; ListNode l2 = null; ListNode r2 = null; ListNode next = null; int pass = 0; while(teamFirst != null) { pass ++; if(pass <= eachLen) { r1 = teamFirst; } if(pass == eachLen + 1) { l2 = teamFirst; } if(pass > eachLen) { r2 = teamFirst; } if(pass == (eachLen << 1)) { break; } teamFirst = teamFirst.next; } r1.next = null; if(r2 != null) { next = r2.next; r2.next = null; } return new ListNode[] {l1,r1,l2,r2,next}; } public ListNode[] merge(ListNode ls,ListNode le,ListNode rs,ListNode re) { if(rs == null) { return new ListNode[] {ls,le}; } ListNode head = null; ListNode tail = null; ListNode pre = null; ListNode cur = null; while(ls != le.next && rs != re.next) { if(ls.val <= rs.val) { cur = ls; ls = ls.next; }else { cur = rs; rs = rs.next; } if(pre == null) { head = cur; pre = cur; }else { pre.next = cur; pre = pre.next; } } if(ls != le.next) { while (ls != le.next) { pre.next = ls; pre = pre.next; tail = ls; ls = ls.next; } }else { while (rs != re.next) { pre.next = rs; pre = pre.next; tail = rs; rs = rs.next; } } return new ListNode[] {head,tail}; }