leetcode:Sort List 使用归并排序的解决思路
2015-09-26 09:55
225 查看
Sort a linked list in O(n log n)
time using constant space complexity.
题目分析:看到此题,想到一般的数组排序有快排和归并排序。想到用归并排序,常见的数组归并排序,时间,空间复杂度都为o(nlogn),但是链表不需要重新分配空间,所以可以使用固定空间。排序的时候就想想有没有常见
解决此题的步骤如下:
1.通过快指针(一次进两步)和慢指针(1次进一步)找到链表的中间节点
2. 将指针分为两部分分别进行归并排序
3. 将归并排序后的两组链表进行合并
源代码如下:
time using constant space complexity.
题目分析:看到此题,想到一般的数组排序有快排和归并排序。想到用归并排序,常见的数组归并排序,时间,空间复杂度都为o(nlogn),但是链表不需要重新分配空间,所以可以使用固定空间。排序的时候就想想有没有常见
解决此题的步骤如下:
1.通过快指针(一次进两步)和慢指针(1次进一步)找到链表的中间节点
2. 将指针分为两部分分别进行归并排序
3. 将归并排序后的两组链表进行合并
源代码如下:
/** * @param 给定的头结点 * @return 归并排序后的头结点 * 通过将链表一分为二,然后分别进行排序之后再归并 * */ public ListNode sortList(ListNode head) { if(head==null||head.next==null) return head; ListNode middle=getMiddleNode(head); ListNode next=middle.next; middle.next=null; return Merge(sortList(head),sortList(next)); } /** * @param 给定的链表头 * @return 返回链表的中间位置 * 采用快指针和慢指针两个指针来获取链表的中间位置,慢指针一次进1步,快指针一次进2步 * */ public ListNode getMiddleNode(ListNode head) { if(head==null||head.next==null) return head; ListNode p=head; ListNode q=head; while(q.next!=null&&q.next.next!=null) { p=p.next; q=q.next.next; } return p; } /** * @param 给定两个排好序的待归并的指针 * @return 给出归并后的指针 * 通过先预先设一个头指针,然后从两个排好序的链表中选择值较小的那一个插入。 * 要记得处理未结束的链表 * */ public ListNode Merge(ListNode a,ListNode b) { ListNode tmphead=new ListNode(-1); ListNode curr=tmphead; while(a!=null&&b!=null) { if(a.val>b.val) { curr.next=b; b=b.next; } else { curr.next=a; a=a.next; } curr=curr.next; } curr.next=a==null?b:a; return tmphead.next; }
相关文章推荐
- 模块化的CSS
- JAVA中写时复制(Copy-On-Write)Map实现
- poj_3260 动态规划
- 再读大道至简第二章
- Win8.1系统如何在开机键中添加睡眠选项?Win8.1系统在开机键中添加睡眠选项的方法
- 第十章 动态选路协议
- Light oj 1158 - Anagram Division(状压+记忆化)
- 使用scrapy-redis分布式爬虫 准备工作
- 基于Neety的高性能中间件Mom
- 【转】Office 2003 EXCEL多窗口打开
- VC 文档+视图 详细分析
- 设置navigationbar上得字体和颜色
- 11992 - Fast Matrix Operations (线段树)
- Android IM之基于Openfire+Smack的聊天服务器的搭建与测试
- HDU 2586——How far away ?——————【LCA模板题】
- 得到PopupWindow的高度
- 回程路由 的作用 为什么 什么时候需要回程路由
- What is WCF
- Spring学习篇01-Spring容器相关基本概念
- Python基础入门之(数字、字符串)