0

0

c++中如何实现链表排序_c++链表排序实现方法

下次还敢

下次还敢

发布时间:2025-09-27 16:46:01

|

844人浏览过

|

来源于php中文网

原创

归并排序是链表排序的首选方法,因其稳定的时间复杂度O(n log n)且适合链表结构。1. 自顶向下归并排序通过快慢指针划分链表,递归合并,代码清晰高效;2. 转换为数组排序利用std::sort,简单但需额外空间,不满足原地要求;3. 自底向上归并排序采用迭代方式,避免深度递归导致的栈溢出,适合长链表。推荐使用自顶向下归并排序,若担心栈深度则选用自底向上版本,数组法仅在空间不限时考虑。

c++中如何实现链表排序_c++链表排序实现方法

在C++中对链表进行排序,常见方法包括转换为数组后排序再重建链表,或直接在链表上使用归并排序。由于链表不支持随机访问,快速排序效率不高,而归并排序更适合处理链表结构,时间复杂度稳定在O(n log n)

1. 使用归并排序对链表排序

归并排序适合链表,因为可以通过快慢指针分割链表,递归合并有序部分。

// 定义链表节点 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} };

ListNode merge(ListNode l1, ListNode l2) { ListNode dummy(0); ListNode curr = &dummy;

while (l1 && l2) {
    if (l1->val < l2->val) {
        curr->next = l1;
        l1 = l1->next;
    } else {
        curr->next = l2;
        l2 = l2->next;
    }
    curr = curr->next;
}

curr->next = l1 ? l1 : l2;
return dummy.next;

}

立即学习C++免费学习笔记(深入)”;

ListNode sortList(ListNode head) { if (!head || !head->next) return head;

// 快慢指针找中点
ListNode *slow = head, *fast = head, *prev = nullptr;
while (fast && fast->next) {
    prev = slow;
    slow = slow->next;
    fast = fast->next->next;
}

// 断开链表
prev->next = nullptr;

// 递归排序两部分
ListNode* left = sortList(head);
ListNode* right = sortList(slow);

// 合并
return merge(left, right);

}

立即学习C++免费学习笔记(深入)”;

2. 转换为数组排序(简单但占用额外空间)

将链表值存入vector,用std::sort排序后再写回链表。

图星人
图星人

好用的AI生图工具,百万免费商用图库

下载
#include #include gorithm>

void sortListArray(ListNode head) { std::vector vals; ListNode curr = head; while (curr) { vals.push_back(curr->val); curr = curr->next; }

std::sort(vals.begin(), vals.end());

curr = head;
for (int v : vals) {
    curr->val = v;
    curr = curr->next;
}

}

立即学习C++免费学习笔记(深入)”;

3. 自底向上归并排序(避免递归溢出)

适用于长链表,通过迭代方式按子长度合并。

ListNode* sortListIterative(ListNode* head) { if (!head || !head->next) return head;
// 获取链表长度
int len = 0;
ListNode* curr = head;
while (curr) {
    len++;
    curr = curr->next;
}

ListNode dummy(0);
dummy.next = head;

for (int subLen = 1; subLen < len; subLen <<= 1) {
    ListNode* prev = &dummy;
    ListNode* current = dummy.next;

    while (current) {
        ListNode* h1 = current;
        ListNode* h2 = cut(h1, subLen);
        current = cut(h2, subLen);
        prev->next = merge(h1, h2);
        while (prev->next) prev = prev->next;
    }
}
return dummy.next;

}

// 切断链表,返回后半部分头节点 ListNode cut(ListNode head, int n) { ListNode p = head; while (--n && p) { p = p->next; } if (!p) return nullptr; ListNode next = p->next; p->next = nullptr; return next; }

基本上就这些。归并排序是最推荐的方式,尤其是自顶向下版本代码清晰,适合大多数场景。如果担心递归深度,可用自底向上版本。数组法虽然简单,但破坏了链表原地操作的优势。选择哪种方法取决于性能要求和空间限制。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

769

2023.08.22

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

387

2023.09.04

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

93

2023.09.25

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

381

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

542

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

176

2023.11.23

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.8万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 19万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号