溫馨提示×

C++歸并排序如何處理鏈表排序

c++
小樊
82
2024-07-16 19:49:49
欄目: 編程語言

在C++中使用歸并排序處理鏈表排序的步驟如下:

  1. 定義鏈表節(jié)點結(jié)構(gòu)體,包括節(jié)點值和指向下一個節(jié)點的指針。
struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};
  1. 實現(xiàn)歸并排序的遞歸函數(shù),主要包括兩個步驟:分割鏈表和合并鏈表。
ListNode* mergeSort(ListNode* head) {
    if (head == nullptr || head->next == nullptr) {
        return head;
    }
    
    // 快慢指針找中點
    ListNode* fast = head;
    ListNode* slow = head;
    ListNode* prev = nullptr;
    
    while (fast != nullptr && fast->next != nullptr) {
        prev = slow;
        slow = slow->next;
        fast = fast->next->next;
    }
    
    prev->next = nullptr; // 斷開鏈表
    
    ListNode* left = mergeSort(head);
    ListNode* right = mergeSort(slow);
    
    return merge(left, right);
}
  1. 實現(xiàn)合并鏈表的函數(shù),用于將兩個有序鏈表合并為一個有序鏈表。
ListNode* merge(ListNode* l1, ListNode* l2) {
    ListNode* dummy = new ListNode(0);
    ListNode* cur = dummy;
    
    while (l1 != nullptr && l2 != nullptr) {
        if (l1->val < l2->val) {
            cur->next = l1;
            l1 = l1->next;
        } else {
            cur->next = l2;
            l2 = l2->next;
        }
        cur = cur->next;
    }
    
    if (l1 != nullptr) {
        cur->next = l1;
    } else {
        cur->next = l2;
    }
    
    return dummy->next;
}
  1. 調(diào)用歸并排序函數(shù)對鏈表進行排序。
ListNode* sortList(ListNode* head) {
    return mergeSort(head);
}

通過以上步驟,就可以在C++中實現(xiàn)歸并排序?qū)︽湵磉M行排序。

0