描述
给定一个节点数为n的无序单链表,对其按升序排序。
数据范围:0<n≤100000,保证节点权值在[−109,109]之内。
要求:空间复杂度 O(n),时间复杂度 O(nlogn)
示例1
输入:
[1,3,2,4,5]
复制返回值:
{1,2,3,4,5}
解法一:转换数组排序
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
List<Integer> list = new ArrayList<>();
int i = 0;
while(head != null){
list.add(head.val);
head = head.next;
i ++;
}
int[] arr = list.stream()
.mapToInt(j -> j)
.toArray();
Arrays.sort(arr);
ListNode node = new ListNode(arr[0]);
ListNode cur = node;
for(int j = 1; j < arr.length; j ++) {
ListNode k = new ListNode(arr[j]);
cur.next = k;
cur = cur.next;
}
return node;
}
}
解法二:归并排序
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) {
if(head == null || head.next == null) {
return head;
}
ListNode left = head;
ListNode mid = head.next;
ListNode right = head.next.next;
while(right != null && right.next != null) {
left = left.next;
mid = mid.next;
right = right.next.next;
}
left.next = null;
return Merge(sortInList(head), sortInList(mid));
}
public static ListNode Merge(ListNode head1, ListNode head2) {
if(head1 == null) {
return head2;
}
if(head2 == null) {
return head1;
}
ListNode node = new ListNode(-1);
ListNode cur = node;
while(head1 != null && head2 != null) {
if(head1.val <= head2.val) {
cur.next = head1;
head1 = head1.next;
} else {
cur.next = head2;
head2 = head2.next;
}
cur = cur.next;
}
if(head1 != null) {
cur.next = head1;
}
if(head2 != null) {
cur.next = head2;
}
return node.next;
}
}