排序链表

199 阅读1分钟

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

示例 1:

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

示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        if( head == null || head.next == null ){
            return head;
        }
        ListNode slow = head , fast = head , pre = head;
        while( fast != null && fast.next != null ){
            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;
        }
        l2.next = merge( l1 , l2.next );
        return l2;
    }
}

解题思路: 题目要求时间复杂度nlogn ,则需要使用快排或者归并排序 , 因为是链表 , 可以采用归并 , 对链表进行对半短链 ,断到单节点 , 然后进行归并 ,最后返回