题目
思路
- 找中点并每次拆分链表
- 递归排序
- 合并两个有序链表
Java
class Solution {
public ListNode sortList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode mid = splitMid(head);
ListNode left = sortList(head);
ListNode right = sortList(mid);
return merge(left, right);
}
private ListNode splitMid(ListNode head) {
ListNode slow = head, fast = head, prev = null;
while (fast != null && fast.next != null) {
prev = slow;
slow = slow.next;
fast = fast.next.next;
}
prev.next = null;
return slow;
}
private ListNode merge(ListNode a, ListNode b) {
ListNode dummy = new ListNode(0), p = dummy;
while (a != null && b != null) {
if (a.val <= b.val) {
p.next = a;
a = a.next;
} else {
p.next = b;
b = b.next;
}
p = p.next;
}
p.next = (a != null) ? a : b;
return dummy.next;
}
}