/**
* 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
*/
public class SortList {
//排序链表
public static ListNode sortList(ListNode list){
if(list == null || list.next == null){
return list;
}
//获取中间节点
ListNode mid = getMiddleNode(list);
//保留链表后半段的头结点
ListNode after = mid.next;
//截断链表
mid.next = null;
ListNode left = sortList(list);
ListNode right = sortList(after);
ListNode result = mergeTwoList(left, right);
return result;
}
//合并两个有序链表
public static ListNode mergeTwoList(ListNode l1, ListNode l2){
ListNode current = new ListNode(0);
ListNode result = current;
while(l1 != null && l2 != null){
if(l1.val > l2.val){
current.next = l2;
l2 = l2.next;
}else{
current.next = l1;
l1 = l1.next;
}
current = current.next;
}
if(l1 == null){
current.next = l2;
}else{
current.next = l1;
}
return result.next;
}
//获取链表的中间节点
public static ListNode getMiddleNode(ListNode head){
//如果只有一个节点,就直接返回
if(head == null || head.next == null){
return head;
}
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null){
//一次移动一个节点
slow = slow.next;
//一次移动两个节点
fast = fast.next.next;
}
return slow;
}
public static void main(String[] args){
ListNode list = new ListNode(-1);
ListNode node1 = new ListNode(9);
ListNode node2 = new ListNode(1);
ListNode node3 = new ListNode(8);
ListNode node4 = new ListNode(0);
ListNode node5 = new ListNode(5);
ListNode node6 = new ListNode(3);
ListNode node7 = new ListNode(7);
list.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
node6.next = node7;
ListNode listNode = sortList(list);
while (listNode != null){
System.out.println(listNode.val);
listNode = listNode.next;
}
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}