题目:
在O(n log n)时间内使用常数空间复杂度对链表进行排序。
思路:
归并排序
代码:
public ListNode sortList(ListNode head) {
// 0个节点 || 1个节点
if (head == null || head.next == null)
return head;
// >= 2个节点
ListNode first = head, second = null, mid = getMid(head);
second = mid.next;
mid.next = null; //将链表分为两段!!!!
//递归
first = sortList(first);
second = sortList(second);
return merge(first, second);
}
//排序
ListNode merge(ListNode first, ListNode second) {
if (first == null)
return second;
if (second == null)
return first;
ListNode res = new ListNode(0);
ListNode curr = res;//控制新链表顺序的point
while (first != null && second != null) {
if (first.val < second.val) {
curr.next = first;
curr = curr.next;
first = first.next;
} else {
curr.next = second;
curr = curr.next;
second = second.next;
}
}
if (first != null)
curr.next = first;
if (second != null)
curr.next = second;
return res.next;
}
//将链表平分为两段,返回第一段末尾 例如:5个点返回2号点,6个点返回3号点
ListNode getMid(ListNode head) {
ListNode slow = head, fast = head.next;
while (fast!=null&&fast.next!=null) {
slow=slow.next;
fast=fast.next.next;
}
return slow;
}