题目:
Given the head
of a linked list, return the list after sorting it in ascending order.
Follow up: Can you sort the linked list in O(n logn)
time and O(1)
memory (i.e. constant space)?
Example 1:
Input: head = [4,2,1,3] Output: [1,2,3,4]
Example 2:
Input: head = [-1,5,3,4,0] Output: [-1,0,3,4,5]
Example 3:
Input: head = [] Output: []
Constraints:
- The number of nodes in the list is in the range
[0, 5 * 104]
. -105 <= Node.val <= 105
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void swap(int& a, int& b) {
int tmp = a;
a = b;
b = tmp;
return;
}
ListNode* getPartition(ListNode* head, ListNode* end) {
ListNode *key = head, *p = head, *cur = head->next;
while(cur != end)
{
if(cur->val < key->val)
{
p = p->next;
swap(cur->val, p->val);
}
cur = cur->next;
}
swap(key->val, p->val);
return p;
}
void sort(ListNode* head, ListNode* end) {
if(head == end)
return;
ListNode* partition = getPartition(head, end);
sort(head, partition);
sort(partition->next, end);
}
ListNode* sortList(ListNode* head) {
if(head == NULL || head->next == NULL)
return head;
sort(head, NULL);
return head;
}
};