在 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 ,则需要使用快排或者归并排序 , 因为是链表 , 可以采用归并 , 对链表进行对半短链 ,断到单节点 , 然后进行归并 ,最后返回