题目描述
Sort a linked list in
O
(
n
log
n
) time using constant space complexity.
解决思路
看到题目中的 nlogn 以及 sort,很自然的联想到mergesort的思想。只不过mergesort通常是以排序数组元素出现的,现在变成了排序链表。
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode mid = findMiddle(head);
ListNode right = sortList(mid.next);
mid.next = null;
ListNode left = sortList(head);
return mergeSort(left, right);
}
public static ListNode mergeSort(ListNode l1, ListNode l2) {
if (l1 == null)
return l2;
if (l2 == null)
return l1;
ListNode dummy = new ListNode(0);
ListNode head = dummy;
while (l1 != null && l2 != null) {
if (l1.val > l2.val) {
head.next = l2;
l2 = l2.next;
} else {
head.next = l1;
l1 = l1.next;
}
head = head.next;
}
if (l1 == null)
head.next = l2;
if (l2 == null)
head.next = l1;
return dummy.next;
}
public static ListNode findMiddle(ListNode head) {
ListNode t = head;
ListNode tn = head.next;
while (tn != null && tn.next != null) {
t = tn;
tn = t.next.next;
}
return t;
}
}