博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单链表的归并排序
阅读量:5782 次
发布时间:2019-06-18

本文共 1501 字,大约阅读时间需要 5 分钟。

思路:

  相信大家对数组的归并排序非常了解,不了解的可以自己百度。本博客只是对单链表的归并排序中的小细节进行阐述.

这个图,就是一种分治的方式,当递归到最底层时,对两个数进行排序,当回到上一层,其实就得到了,两个有序的序列,然后再对这两个序列进行排序并合并成一个新的序列。这样一层一层的重复相同的操作,就可以得到整个序列的排序!

 

重点:

  对于来两个有序序列的合并,是这样合并的。

  先申请一个局部的节点(相当于 表头 ):然后,比较左右链表的最小值,谁最小就把谁拆下来,放在新的链表后面。值得注意的是:全过程只是申请了一个表头节点的内存。这一点在不计算递归所使用的内存的话,空间复杂度为O(1)

下面看图解:

      

然后,注意一下代码中p的维护,因为p是新链表的尾指针!

代码:

struct ListNode {    int val;    ListNode *next;    ListNode(int x) : val(x), next(NULL) {}};class Solution {public:    ListNode *sortList(ListNode *head){        if (!head || !head->next) return head;        //空链表和只有一个元素的链表不需要排序        ListNode *p = head, *q = head->next;        //找到链表的中间位置        while (q&&q->next){        //快慢指针,注意必须前两步存在            p = p->next;            q = q->next->next;        }        ListNode *left = sortList(p->next);        //右链表        p->next = NULL;        //将其断开,为两个链表        ListNode *right = sortList(head);                return merge(left, right);    }    ListNode *merge(ListNode *left, ListNode *right)    {        ListNode dummy(0);        //申请一个假节点        ListNode *p = &dummy;        while (left&&right){            if (left->val < right->val){                p->next = left;                left = left->next;            }            else{                p->next = right;                right = right->next;            }            p = p->next;        }        if (left)p->next = left;        if (right)p->next = right;        return dummy.next;    }};

 

转载于:https://www.cnblogs.com/ALINGMAOMAO/p/9884527.html

你可能感兴趣的文章
(step6.1.5)hdu 1233(还是畅通工程——最小生成树)
查看>>
Membership三步曲之进阶篇 - 深入剖析Provider Model
查看>>
前端优化及相关要点总结
查看>>
struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
查看>>
25 个精美的手机网站模板
查看>>
C#反射实例应用--------获取程序集信息和通过类名创建类实例
查看>>
VC中实现文字竖排的简单方法
查看>>
会话标识未更新
查看>>
阿里架构师:程序员必须掌握的几项核心技术能力
查看>>
程序员常用的六大技术博客类
查看>>
Iceworks 2.8.0 发布,自定义你的 React 模板
查看>>
胖哥学SpringMVC:请求方式转换过滤器配置
查看>>
Kotlin 更加优雅的 Builder - 理解 with
查看>>
前端日拱一卒D6——字符编码与浏览器解析
查看>>
深入理解浏览器的缓存机制
查看>>
微软向Linux社区开放60000多项专利:对开源微软是认真的
查看>>
Hoshin Kanri在丰田的应用
查看>>
又拍云沈志华:如何打造一款安全的App
查看>>
克服大数据集群的挑战
查看>>
PostgreSQL并发控制(MVCC, 事务,事务隔离级别)
查看>>