LeetCode | 148. Sort List

1LOVESJohnny發表於2020-09-30

 

題目:

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;
    }
};

 

 

相關文章