https://leetcode.com/problems/sort-list/

1. Using STL:

  1. //76 ms, 14.1 MB
  2. /**
  3. * Definition for singly-linked list.
  4. * struct ListNode {
  5. * int val;
  6. * ListNode *next;
  7. * ListNode(int x) : val(x), next(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. ListNode* sortList(ListNode* head) {
  13. if(!head) return nullptr;
  14. vector<int> treelist;
  15. ListNode* curr = head;
  16. while(head){
  17. treelist.push_back(head->val);
  18. head = head->next;
  19. }
  20. sort(treelist.begin(), treelist.end());
  21. ListNode* dummy = new ListNode(INT_MIN);
  22. ListNode* newhead = dummy;
  23. for(int i=0; i<treelist.size(); i++){
  24. newhead->next = new ListNode(treelist[i]);
  25. newhead = newhead->next;
  26. }
  27. return dummy->next;
  28. }
  29. };

2. Using swap sort:

//1860 ms, 15.7 MB

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* sortList(ListNode* head) {
        if(!head) return nullptr;

        ListNode* dummy = new ListNode(-1);
        dummy->next = head;
        ListNode* first = dummy->next;
        ListNode* second = dummy->next->next;
        ListNode* prev = dummy->next;

        while(second){
            if(second->val < first->val){
                if(prev == first){
                    dummy->next = second;
                    prev->next = second->next;
                    second->next = prev;

                    second = first->next;
                    first = dummy->next;
                } else {
                    ListNode* tmp = first->next;

                    dummy->next = second;                                  
                    first->next = second->next;
                    second->next = tmp;
                    prev->next = first;          

                    second = first->next;
                    first = dummy->next;
                    prev = prev->next;
                }
            } else {
                prev = prev->next;
                second = second->next;
            }
        }

        /*
        ListNode* test = dummy->next;
        while(test){
            cout << test->val << "->";
            test = test->next;
        }
        cout << "NULL" << endl;
        */

        first->next = sortList(dummy->next->next);

        return first;
    }
};

3. Use merge sort: