温馨提示×

C++归并排序如何处理链表排序

c++
小樊
83
2024-07-16 19:49:49
栏目: 编程语言

在C++中使用归并排序处理链表排序的步骤如下:

  1. 定义链表节点结构体,包括节点值和指向下一个节点的指针。
struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};
  1. 实现归并排序的递归函数,主要包括两个步骤:分割链表和合并链表。
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. 实现合并链表的函数,用于将两个有序链表合并为一个有序链表。
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. 调用归并排序函数对链表进行排序。
ListNode* sortList(ListNode* head) {
    return mergeSort(head);
}

通过以上步骤,就可以在C++中实现归并排序对链表进行排序。

0