148. 排序連結串列

shichap發表於2020-10-04

148. 排序連結串列

O(n log n) 時間複雜度和常數級空間複雜度下,對連結串列進行排序。

示例 1:

輸入: 4->2->1->3
輸出: 1->2->3->4

示例 2:

輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
class Solution {
    // 解題思路歸併排序
    public ListNode sortList(ListNode head) {
        if(head==null || head.next==null){
            return  head;
        }
        ListNode fast=head.next,slow=head;
        while(fast!=null && fast.next!=null){
            slow = slow.next;
            //三個節點以上的時候 fast==null
            // 四個節點的時候 slow=2 fast=2
            // 5個節點的時候
            fast = fast.next.next;
        }
        //當只有兩個節點的時候 tmp =head 
        ListNode tmp = slow.next;
        slow.next = null;
        
        ListNode left = sortList(head);
        ListNode right = sortList(tmp);
        //虛擬頭結點
        ListNode h = new ListNode(0);
        ListNode res = h;
        while(left!=null && right!=null){
            if(left.val<right.val){
                h.next = left;
                left = left.next;
            }else{
                h.next = right;
                right = right.next;
            }
            h = h.next;
        }
        h.next = left!=null?left:right;

        return res.next;
        
    }
}

相關文章