第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};
    }
posted @ 2022-02-18 15:54  现在开始努力  阅读(40)  评论(0)    收藏  举报