原题链接:148. Sort List
【思路】
本题考查归并排序。由于没有random access指针,那么显然是不是合快排。归并排序的基本思想:找到链表的mid节点,然后递归前半部分和后半部分分别进行归并排序,每次排完序之后都要对排好序的链表进行归并:
public ListNode sortList(ListNode head) {
if (head == null || head.next == null) return head;
ListNode mid = getMidListNode(head);
ListNode list2 = mid.next;
mid.next = null;
return mergeList(sortList(head), sortList(list2));
}
private ListNode mergeList(ListNode list1, ListNode list2) {
ListNode dummyHead = new ListNode(0);
ListNode curr = dummyHead;
while (list1 != null && list2 != null) {
if (list1.val < list2.val) {
curr.next = list1;
list1 = list1.next;
} else {
curr.next = list2;
list2 = list2.next;
}
curr = curr.next;
}
curr.next = list1 != null ? list1 : list2;
return dummyHead.next;
}
private ListNode getMidListNode(ListNode head) {
ListNode slow = head, fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
15 / 15
test cases passed. Runtime: 8 ms Your runtime beats 42.29% of javasubmissions.
欢迎优化!