📌  相关文章
📜  用于对按升序和降序交替排序的链表进行排序的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:11:16.658000             🧑  作者: Mango

用于对按升序和降序交替排序的链表进行排序的 C++ 程序

本程序旨在对按升序和降序交替排序的链表进行排序。下面将为您介绍本程序的详细信息。

实现思路

本程序采用归并排序的思路进行排序,具体实现步骤如下:

  1. 将链表平均分成两个子链表,直到每个子链表只有一个节点。
  2. 对每个子链表进行排序,排序方式为按照升序和降序轮流排序。
  3. 将两个排序后的子链表合并成一个有序链表。
程序代码
class Solution {
public:
    ListNode* sortList(ListNode* head) {
        if (head == nullptr || head->next == nullptr) return head; // 链表为空或只有一个节点时直接返回
        ListNode *fast = head->next, *slow = head;
        while (fast != nullptr && fast->next != nullptr) {
            fast = fast->next->next;
            slow = slow->next;
        }
        ListNode *head2 = slow->next;
        slow->next = nullptr; // 将链表平均分成两个子链表
        ListNode *l1 = sortList(head); // 对左侧子链表进行排序
        ListNode *l2 = sortList(head2); // 对右侧子链表进行排序
        return merge(l1, l2); // 合并两个排序后的子链表
    }

private:
    ListNode* merge(ListNode* l1, ListNode* l2) {
        ListNode *dummy = new ListNode(-1), *cur = dummy;
        bool flag = true; // flag 用于实现按照升序和降序轮流排序
        while (l1 != nullptr && l2 != nullptr) {
            if (flag) {
                if (l1->val < l2->val) {
                    cur->next = l1;
                    l1 = l1->next;
                } else {
                    cur->next = l2;
                    l2 = l2->next;
                }
            } else {
                if (l1->val > l2->val) {
                    cur->next = l1;
                    l1 = l1->next;
                } else {
                    cur->next = l2;
                    l2 = l2->next;
                }
            }
            cur = cur->next;
            flag != flag; // 轮流按升序和降序排序
        }
        cur->next = (l1 != nullptr ? l1 : l2); // 将剩余链表直接粘到 cur 后面
        return dummy->next;
    }
};
程序特点

本程序的时间复杂度为 O(n log n),空间复杂度为 O(log n),其中 n 为链表节点个数。

本程序实现简单,代码通俗易懂,具有较高的可读性和可维护性。

总结

本程序是一种非常实用的对按升序和降序交替排序的链表进行排序的方法,可以在实际工作中大大提高开发效率和提高编程水平。希望本程序能对各位程序员们有所启发和帮助。