我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++怎么实现链表排序

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++怎么实现链表排序

本篇内容主要讲解“C++怎么实现链表排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现链表排序”吧!

链表排序

Sort a linked list in O(n log n) time using constant space complexity.

Example 1:

Input: 4->2->1->3
Output: 1->2->3->4

Example 2:

Input: -1->5->3->4->0
Output: -1->0->3->4->5

常见排序方法有很多,插入排序,选择排序,堆排序,快速排序,冒泡排序,归并排序,桶排序等等。。它们的时间复杂度不尽相同,而这里题目限定了时间必须为O(nlgn),符合要求只有快速排序,归并排序,堆排序,而根据单链表的特点,最适于用归并排序。为啥呢?这是由于链表自身的特点决定的,由于不能通过坐标来直接访问元素,所以快排什么的可能不太容易实现(但是被评论区的大神们打脸,还是可以实现的),堆排序的话,如果让新建结点的话,还是可以考虑的,若只能交换结点,最好还是不要用。而归并排序(又称混合排序)因其可以利用递归来交换数字,天然适合链表这种结构。归并排序的核心是一个 merge() 函数,其主要是合并两个有序链表,这个在 LeetCode 中也有单独的题目 Merge Two Sorted Lists。由于两个链表是要有序的才能比较容易 merge,那么对于一个无序的链表,如何才能拆分成有序的两个链表呢?我们从简单来想,什么时候两个链表一定都是有序的?就是当两个链表各只有一个结点的时候,一定是有序的。而归并排序的核心其实是分治法 Divide and Conquer,就是将链表从中间断开,分成两部分,左右两边再分别调用排序的递归函数 sortList(),得到各自有序的链表后,再进行 merge(),这样整体就是有序的了。因为子链表的递归函数中还是会再次拆成两半,当拆到链表只有一个结点时,无法继续拆分了,而这正好满足了前面所说的“一个结点的时候一定是有序的”,这样就可以进行 merge 了。然后再回溯回去,每次得到的都是有序的链表,然后进行 merge,直到还原整个长度。这里将链表从中间断开的方法,采用的就是快慢指针,大家可能对快慢指针找链表中的环比较熟悉,其实找链表中的中点同样好使,因为快指针每次走两步,慢指针每次走一步,当快指针到达链表末尾时,慢指针正好走到中间位置,参见代码如下:

C++ 解法一:

class Solution {public:    ListNode* sortList(ListNode* head) {        if (!head || !head->next) return head;        ListNode *slow = head, *fast = head, *pre = head;        while (fast && fast->next) {            pre = slow;            slow = slow->next;            fast = fast->next->next;        }        pre->next = NULL;        return merge(sortList(head), sortList(slow));    }    ListNode* merge(ListNode* l1, ListNode* l2) {        ListNode *dummy = new ListNode(-1);        ListNode *cur = dummy;        while (l1 && l2) {            if (l1->val < l2->val) {                cur->next = l1;                l1 = l1->next;            } else {                cur->next = l2;                l2 = l2->next;            }            cur = cur->next;        }        if (l1) cur->next = l1;        if (l2) cur->next = l2;        return dummy->next;    }};

Java 解法一:

public class Solution {    public ListNode sortList(ListNode head) {        if (head == null || head.next == null) return head;        ListNode slow = head, fast = head, pre = head;        while (fast != null && fast.next != null) {            pre = slow;            slow = slow.next;            fast = fast.next.next;        }        pre.next = null;        return merge(sortList(head), sortList(slow));    }    public ListNode merge(ListNode l1, ListNode l2) {        ListNode dummy = new ListNode(-1);        ListNode cur = dummy;        while (l1 != null && l2 != null) {            if (l1.val < l2.val) {                cur.next = l1;                l1 = l1.next;            } else {                cur.next = l2;                l2 = l2.next;            }            cur = cur.next;        }        if (l1 != null) cur.next = l1;        if (l2 != null) cur.next = l2;        return dummy.next;    }}

下面这种方法也是归并排序,而且在merge函数中也使用了递归,这样使代码更加简洁啦~

C++ 解法二:

class Solution {public:    ListNode* sortList(ListNode* head) {        if (!head || !head->next) return head;        ListNode *slow = head, *fast = head, *pre = head;        while (fast && fast->next) {            pre = slow;            slow = slow->next;            fast = fast->next->next;        }        pre->next = NULL;        return merge(sortList(head), sortList(slow));    }    ListNode* merge(ListNode* l1, ListNode* l2) {        if (!l1) return l2;        if (!l2) return l1;        if (l1->val < l2->val) {            l1->next = merge(l1->next, l2);            return l1;        } else {            l2->next = merge(l1, l2->next);            return l2;        }    }};

Java 解法二:

public class Solution {    public ListNode sortList(ListNode head) {        if (head == null || head.next == null) return head;        ListNode slow = head, fast = head, pre = head;        while (fast != null && fast.next != null) {            pre = slow;            slow = slow.next;            fast = fast.next.next;        }        pre.next = null;        return merge(sortList(head), sortList(slow));    }    public ListNode merge(ListNode l1, ListNode l2) {        if (l1 == null) return l2;        if (l2 == null) return l1;        if (l1.val < l2.val) {            l1.next = merge(l1.next, l2);            return l1;        } else {            l2.next = merge(l1, l2.next);            return l2;        }    }}

到此,相信大家对“C++怎么实现链表排序”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++怎么实现链表排序

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++怎么实现链表排序

本篇内容主要讲解“C++怎么实现链表排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现链表排序”吧!链表排序Sort a linked list in O(n log n) tim
2023-06-20

C++怎么实现链表插入排序

本篇内容主要讲解“C++怎么实现链表插入排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现链表插入排序”吧!链表插入排序链表的插入排序实现原理很简单,就是一个元素一个元素的从原链表
2023-06-20

C++怎么合并两个排序的链表

本篇内容主要讲解“C++怎么合并两个排序的链表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么合并两个排序的链表”吧!题目描述:输入两个递增的链表,单个链表的长度为n,合并这两个链表并使
2023-06-22

C++怎么实现单链表

本文小编为大家详细介绍“C++怎么实现单链表”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现单链表”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单链表链表内存空间不一定连续,其扩展性较好。多余的不多
2023-07-02

C++怎么实现合并k个有序链表

本篇内容介绍了“C++怎么实现合并k个有序链表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Merge k Sorted Lists 合并k
2023-06-19

C#SortedList排序列表的实现

本文主要介绍了C#SortedList排序列表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-14

怎么用C++实现合并k个有序链表

本篇内容主要讲解“怎么用C++实现合并k个有序链表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用C++实现合并k个有序链表”吧!Merge k Sorted Lists 合并k个有序链表M
2023-06-20

C++怎么实现双向链表

这篇“C++怎么实现双向链表”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++怎么实现双向链表”文章吧。前言:前面文章分析
2023-06-29

c++如何合并K个排序链表

这篇“c++如何合并K个排序链表”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“c++如何合并K个排序链表”文章吧。合并 k
2023-06-02

react怎么实现列表排序

react实现列表排序的方法:1、将整体设置成一个无序列表,并将子元素放置li内;2、在“Radio.Group”中进行Radio的移动;3、通过arrayMoveImmutable数组重新排序函数实现列表排序即可。
2023-05-14

c语言排序怎么实现

c 语言中实现排序可以使用多种算法,包括:冒泡排序:比较相邻元素,将较小的元素向前移动。选择排序:找到无序序列中的最小元素,并与第一个元素交换位置。插入排序:将元素逐个插入到已有序序列中。归并排序:分治排序,合并排序后的左右两半。快速排序:
c语言排序怎么实现
2024-05-15

C++怎么实现颜色排序

这篇文章主要介绍了C++怎么实现颜色排序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++怎么实现颜色排序文章都会有所收获,下面我们一起来看看吧。颜色排序Example:Input: [2,0,2,1,1,0
2023-06-19

C# SortedList排序列表如何实现

这篇文章主要讲解了“C# SortedList排序列表如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C# SortedList排序列表如何实现”吧!在 C# 中,SortedList
2023-07-05

C++中怎么实现链表操作

C++中怎么实现链表操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C++链表操作代码示例:// linklist.cpp : 定义控制台应用程序的入口点。 #inclu
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录