Sort List
2015-10-07 18:57
176 查看
Sort a linked list in O(n log n) time using constant space complexity.
思路: 利用归并排序的思想,每一次采用快慢指正找出链表的中点,将中点左边的链表进行排序,然后中点右边的链表进行排序,最后将排好序的左右两边的链表进行归并。
思路: 利用归并排序的思想,每一次采用快慢指正找出链表的中点,将中点左边的链表进行排序,然后中点右边的链表进行排序,最后将排好序的左右两边的链表进行归并。
public class Solution { public ListNode sortList(ListNode head) { if(head==null || head.next==null) return head; ListNode mid=getMid(head); ListNode next=mid.next; mid.next=null; //将中点左边的链表进行排序 ListNode left=sortList(head); //将中点右边的链表进行排序 ListNode right=sortList(next); //返回归并后的链表 return mergeList(left,right); } //采用快慢指针找出链表的中点,slow每一次走一步,fast每次走两步,当fast走到末尾的时候,slow所在的地方就是该链表的中点 ListNode getMid(ListNode head) { ListNode slow=head; ListNode fast=head; while( fast.next!=null && fast.next.next!=null ) { slow=slow.next; fast=fast.next; fast=fast.next; } return slow; } //归并两个链表 public ListNode mergeList(ListNode head1,ListNode head2) { ListNode head=new ListNode(-1); ListNode last=head; while(head1!=null && head2!=null) { if(head1.val<=head2.val) { last.next=head1; last=last.next; head1=head1.next; }else { last.next=head2; last=last.next; head2=head2.next; } } if(head1!=null) last.next=head1; else if(head2!=null) last.next=head2; return head.next; } }
相关文章推荐
- 项目33.1利用循环求和
- Tarena - 多线程基础
- C#学习之多线程开发技术(十)
- 对某个Android应用的某一功能测试
- 一段好玩的程序
- 从今天起,做一个幸福的人
- Struts2复习笔记
- 网络开发--NSURLConnection类的简单介绍
- 黑马程序员——4.继承(接口、多态、内部类、异常、包)
- Android常见分辨率及屏幕适配注意事项
- Cassandra查询语言CQL的基本使用
- <PY>kNN
- eclipse常用快捷键
- Jmeter mysql testing遇到的问题
- centos 7 编译安装mysql5.5.36都需要装哪些个东西
- Bootstrap CSS——导航条
- CImg 图像库 存储结构
- Java虚拟机12:Java内存模型
- 认识DOS
- UFLDL 教程学习笔记(四)