leetcode148 链表排序

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

使用归并排序

public ListNode sortList(ListNode head) {
    if(head == null || head.next == null) return head;
    ListNode slow = head;
    ListNode pre = head;
    ListNode fast = head;
    while(fast != null && fast.next != null){
        // 找出中间节点,无论奇偶数节点,pre都停留在中间的前一个
        // slow会停在中间或中间的后一个
        pre = slow;
        slow = slow.next;
        fast = fast.next.next;
    }
    pre.next = null;
    return merge(sortList(head), sortList(slow));
}
public ListNode merge(ListNode l1, ListNode l2){
    if(l1 == null) return l2;
    if(l2 == null) return l1;
    if(l1.val < l2.val){
        l1.next = merge(l1.next, l2);
        return l1;
    }else{
        l2.next = merge(l1, l2.next);
        return l2;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43322057/article/details/84750013