1. 程式人生 > >(leetcode)連結串列排序,時間(nlogn)空間 (1)

(leetcode)連結串列排序,時間(nlogn)空間 (1)

只有歸併排序滿足要求

public class Solution {
    public ListNode findMiddle (ListNode head){
        ListNode chaser = head;
        ListNode runner = head.next;
        while (runner!=null && runner.next!=null){
            runner=runner.next.next;
            chaser=chaser.next;
        }
        return chaser;
    }
    public ListNode mergeTwoList (ListNode p1,ListNode p2){
        ListNode head=new ListNode(0);
        ListNode dummy=head;
        if (p1==null){
            return p2;
        }
        if (p2==null){
            return p1;
        }
        while (p1!=null && p2!=null){
            if (p1.val<p2.val){
                head.next=p1;
                p1=p1.next;
            }else{
                head.next=p2;
                p2=p2.next;
            }
            head=head.next;
        }
        if (p1==null){
            head.next=p2;
        }
        if (p2==null){
            head.next=p1;
        }
        return dummy.next;
    }
    public ListNode sortList(ListNode head) {
        if (head==null || head.next==null){
            return head;
        }
        ListNode mid= findMiddle(head);
        ListNode right = sortList(mid.next);
        mid.next=null;
        ListNode left = sortList(head);
        return mergeTwoList (left,right);
    }
}

排序的過程: ①左遞迴,返回左連結串列頭指標 ②切斷連結串列 ③右遞迴,返回右連結串列頭指標 ④對左右連結串列做merge過程,返回頭指標

merge過程: 即歸併過程,左右連結串列誰的值小,粘上誰的結點,返回頭指標

尋找中值過程: 快慢指標,快指標跑完,慢指標位置即中點

空間複雜度:明顯為O(1)

時間複雜度分析:每次排序有一個findMiddle過程和一個merge過程,把兩個過程分開看,都是O(nlogn)級別的,兩者相加明顯也是O(nlogn)