(leetcode)連結串列排序,時間(nlogn)空間 (1)
阿新 • • 發佈:2018-12-18
只有歸併排序滿足要求
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)