第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};     }