在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序。
样例
给出 1->3->2->null
,给它排序变成 1->2->3->null
.
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param head: The head of linked list.
* @return: You should return the head of the sorted linked list, using constant space complexity.
*/
ListNode * sortList(ListNode * head) {
// write your code here
if (head == NULL || head->next == NULL) {
return head;
}
ListNode* mid = head;
ListNode* tail = head->next->next;
while (tail != NULL && tail->next != NULL && tail->next->next != NULL) {
tail = tail->next->next;
mid = mid->next;
}
ListNode* head2 = mid->next;
mid->next = NULL;
ListNode* l1 = sortList(head);
ListNode* l2 = sortList(head2);
return mergeLists(l1, l2);
}
ListNode* mergeLists(ListNode* l1, ListNode* l2) {
if (l1 == NULL) {
return l2;
} else if (l2 == NULL) {
return l1;
}
if (l1->val <= l2->val) {
ListNode* l1_next = l1->next;
l1->next = mergeLists(l1_next, l2);
return l1;
} else {
ListNode* l2_next = l2->next;
l2->next = mergeLists(l1, l2_next);
return l2;
}
}
};