第一种:使用Java内置的排序方法对了list排序,Collections.sort()方法的时间复杂读为O(n),所以改题时间复杂度O(n),空间复杂度O(n)实现了,但是本题应该是要考我们归并排序,见第二种方法
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类 the head node
* @return ListNode类
*/
public ListNode sortInList (ListNode head) {
// write code here
ArrayList<Integer> list = new ArrayList<>();
while (head != null) {
list.add(head.val);
head = head.next;
}
Collections.sort(list);
ListNode pre = new ListNode(-1);
ListNode result = pre;
ListNode node = null;
for (int i = 0; i < list.size(); i++) {
node = new ListNode(list.get(i));
pre.next = node;
pre = pre.next;
}
return result.next;
}
}
第二种:归并排序的思想,先分后合
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类 the head node
* @return ListNode类
*/
public ListNode sortInList (ListNode head) {
// write code here
//找到中点的位置, 快指针一次走两步,慢指针一次走一步
if (head == null || head.next == null ) {
return head;
}
ListNode fast = head.next;
ListNode slow = head;
while (slow != null && fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode right = slow.next;
ListNode left = head;
//中间分割开
slow.next = null;
//左面一段
left = sortInList(left);
//右面一段
right = sortInList(right);
//合成排序后的返回
return merge(left, right);
}
private ListNode merge(ListNode left, ListNode right) {
ListNode pre = new ListNode(-1);
ListNode result = pre;
while (left != null && right != null ) {
if (left.val < right.val) {
pre.next = left;
left = left.next;
} else {
pre.next = right;
right = right.next;
}
pre = pre.next;
}
if (left != null) {
pre.next = left;
}
if (right != null) {
pre.next = right;
}
return result.next;
}
}