148. 排序链表

148. 排序链表

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

思路

此题为链表的归并排序
1 使用快慢指针法找到链表的中间节点
2 然后断开链表,两个链表分别递归排序
3 将两个有序的链表归并成一个有序链表

代码

class Solution {
    //归并排序
    public ListNode sortList(ListNode head) {
        if (head == null || head.next == null){
            return head;
        }
        ListNode sentinal = new ListNode(0, head);
        ListNode p1 = sentinal;
        ListNode p2 = sentinal;
        while (p2 != null && p2.next != null){
            p1 = p1.next;
            p2 = p2.next.next;
        }
        //p1为中间节点
        p2 = p1.next;
        p1.next = null;
        //两边递归再归并
        ListNode cur1 = sortList(head);
        ListNode cur2 = sortList(p2);
        ListNode nxt1 = cur1.next;
        ListNode nxt2 = cur2.next;
        sentinal.next = null;
        ListNode newTail = sentinal;
        while (cur1 != null && cur2 != null){
            if(cur1.val <= cur2.val){
                newTail.next = cur1;
                cur1 = nxt1;
                if (nxt1 != null) {
                    nxt1 = nxt1.next;
                }
            }else {
                newTail.next = cur2;
                cur2 = nxt2;
                if (nxt2 != null){
                    nxt2 = nxt2.next;
                }
            }
            newTail = newTail.next;
        }
        if (cur1 != null){
            newTail.next = cur1;
        }
        if (cur2 != null){
            newTail.next = cur2;
        }
        return sentinal.next;
    }
}

你可能感兴趣的:(148. 排序链表)