Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Sắp xếp danh sách liên kết trong C++


Cho danh sách liên kết, sắp xếp trong O(n log n) với không gian O(1). Ví dụ: [4,2,1,3] → [1,2,3,4].

Giải thuật

  • Hàm merge(l1, l2) trộn hai danh sách đã sắp xếp.
  • Hàm sortList(head):
    • Nếu head == null hoặc head->next == null trả về head.
    • slow = head, fast = head, prev = null.
    • Khi fast && fast->next: prev = slow; slow = slow->next; fast = fast->next->next.
    • prev->next = null.
    • l1 = sortList(head), l2 = sortList(slow).
    • Trả về merge(l1, l2).

Ví dụ mã C++

#include <bits/stdc++.h>
using namespace std;

class ListNode {
public:
    int val;
    ListNode *next;
    ListNode(int data) { val = data; next = NULL; }
};

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        if (!head || !head->next) return head;
        ListNode *slow = head, *fast = head, *prev = NULL;
        while (fast && fast->next) {
            prev = slow;
            slow = slow->next;
            fast = fast->next->next;
        }
        prev->next = NULL;
        ListNode* l1 = sortList(head);
        ListNode* l2 = sortList(slow);
        return mergeList(l1, l2);
    }
    ListNode* mergeList(ListNode* l1, ListNode* l2) {
        ListNode* dummy = new ListNode(0);
        ListNode* p = dummy;
        while (l1 && l2) {
            if (l1->val <= l2->val) { p->next = l1; l1 = l1->next; }
            else { p->next = l2; l2 = l2->next; }
            p = p->next;
        }
        p->next = l1 ? l1 : l2;
        return dummy->next;
    }
};

Đầu vào

[4,2,1,3,5,9,8,6,7]

Đầu ra

[1, 2, 3, 4, 5, 6, 7, 18, 19, ]