📅  最后修改于: 2023-12-03 15:11:16.658000             🧑  作者: Mango
本程序旨在对按升序和降序交替排序的链表进行排序。下面将为您介绍本程序的详细信息。
本程序采用归并排序的思路进行排序,具体实现步骤如下:
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 为链表节点个数。
本程序实现简单,代码通俗易懂,具有较高的可读性和可维护性。
本程序是一种非常实用的对按升序和降序交替排序的链表进行排序的方法,可以在实际工作中大大提高开发效率和提高编程水平。希望本程序能对各位程序员们有所启发和帮助。