用O(n logn)的时间复杂度来排序链表
这里采用归并排序来实现单链表的排序,此外符合时间复杂度要求的还可以使用快速排序来求解
/**
* 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 = getMid(head);
ListNode midNext = mid.next;
//将链表分为两半
mid.next = null;
return mergeNode(sortList(head), sortList(midNext));
}
//采用快慢指针来找到链表的中点
public ListNode getMid (ListNode head) {
if (head == null || head.next == null) {
return head;
}
//定义快慢指针
ListNode slow = head;
ListNode quick = head;
//快指针+2,慢指针+1
while (quick.next != null && quick.next.next != null) {
slow = slow.next;
quick = quick.next.next;
}
return slow;
}
//合并两个链表
public ListNode mergeNode (ListNode node1, ListNode node2) {
ListNode pre = new ListNode(0);
ListNode cur = pre;
ListNode cur1 = node1;
ListNode cur2 = node2;
while (cur1 != null && cur2 != null) {
if (cur1.val < cur2.val) {
cur.next = cur1;
cur1 = cur1.next;
}
else {
cur.next = cur2;
cur2 = cur2.next;
}
cur = cur.next;
}
//因为是链表,和数组不同,所以不用一直循环到表尾
if (cur1 != null) {
cur.next = cur1;
}
if (cur2 != null) {
cur.next = cur2;
}
return pre.next;
}
}