148. Sort List
Sort a linked list in O(n log n) time using constant space complexity.
Example 1:
Input: 4->2->1->3
Output: 1->2->3->4
Example 2:
Input: -1->5->3->4->0
Output: -1->0->3->4->5
此题需要时间复杂度为O(n log n),那么用归并排序。每次都在链表的中间截取,对前后进行排序再拼接。
class Solution {
public ListNode devide(ListNode head) {
// 剩下两个元素,判断返回
if (head == null || head.next == null) {
return head;
}
if (head.next.next == null) {
if (head.val > head.next.val) {
ListNode headNext = head.next;
headNext.next = head;
head.next = null;
head = headNext;
}
return head;
}
// 快慢指针找中点
ListNode mid = head;
ListNode fast = head;
while (fast.next != null && fast.next.next != null) {
mid = mid.next;
fast = fast.next.next;
}
ListNode midNext = mid.next;
mid.next = null;
// 分段排序
ListNode sortedFront = devide(head);
ListNode sortedTail = devide(midNext);
// 合并
return merge(sortedFront, sortedTail);
}
private ListNode merge(ListNode sortedFront, ListNode sortedTail) {
ListNode begin = new ListNode(-1);
ListNode cur = begin;
while (sortedFront != null || sortedTail != null) {
if (sortedFront != null && sortedTail == null) {
cur.next = sortedFront;
sortedFront = sortedFront.next;
cur = cur.next;
} else if (sortedFront == null && sortedTail != null) {
cur.next = sortedTail;
sortedTail = sortedTail.next;
cur = cur.next;
} else {
if (sortedFront.val <= sortedTail.val) {
cur.next = sortedFront;
sortedFront = sortedFront.next;
cur = cur.next;
} else {
cur.next = sortedTail;
sortedTail = sortedTail.next;
cur = cur.next;
}
}
}
return begin.next;
}
public ListNode sortList(ListNode head) {
return devide(head);
}
}
来源:CSDN
作者:粽子包子粿条
链接:https://blog.csdn.net/lianggx3/article/details/104463590