题目:

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

题解:

考虑到要求用O(nlogn)的时间复杂度和constant space complexity来sort list,自然而然想到了merge sort方法。同时我们还已经做过了merge k sorted list和merge 2 sorted list。这样这个问题就比较容易了。

不过这道题要找linkedlist中点,那当然就要用最经典的faster和slower方法,faster速度是slower的两倍,当faster到链尾时,slower就是中点,slower的next是下一半的开始点。

解决了这些问题,题目就很容易解出了。

代码如下:

 1     public ListNode sortList(ListNode head) {
 2         if(head == null|| head.next == null)
 3             return head;
 4         ListNode slow = head, fast = head, firsthalf = head;
 5         while(fast.next!=null&&fast.next.next!=null){
 6             slow = slow.next;
 7             fast = fast.next.next;
 8         }
 9         ListNode secondhalf = slow.next;
         slow.next = null;
         
         ListNode leftlist = null, rightlist =null;
         if(firsthalf!=secondhalf){
             leftlist = sortList(firsthalf);
             rightlist = sortList(secondhalf);
         }
         return mergeTwoLists(leftlist, rightlist);
     }
     
     public ListNode mergeTwoLists(ListNode leftlist, ListNode rightlist){
         if(rightlist == null)
             return leftlist;
         if(leftlist == null)
             return rightlist;
         
         ListNode fakehead = new ListNode(-1);
         ListNode ptr = fakehead;
         while(rightlist!=null&&leftlist!=null){
             if(rightlist.val<leftlist.val){
                 ptr.next = rightlist;
                 ptr = ptr.next;
                 rightlist = rightlist.next;
             }else{
                 ptr.next = leftlist;
                 ptr = ptr.next;
                 leftlist = leftlist.next;
             }
         }
         
         if(rightlist!=null)
             ptr.next = rightlist;
         if(leftlist!=null)
             ptr.next = leftlist;
         
         return fakehead.next;
     }

最新文章

  1. JAVA学习笔记之static——2016.3.10
  2. Qt之添加QLabel的点击事件
  3. Python——函数中的关键字参数
  4. MAC OS 系统使用心得
  5. Gulp-前端进阶A-2
  6. [ZZ] KlayGE 游戏引擎 之 Order Independent Transparency(OIT)
  7. Spring boot 1.3.5 RELEASE 官方文档中文翻译--Part2:新手入门
  8. JZ2440开发笔记(2)——minicom的安装和配置使用【转】
  9. 四句话总结JavaScript作用域
  10. CM3存储器系统
  11. linux命令行模式下实现代理上网(转)
  12. yum安装memcache,mongo扩展以及python的mysql模块安装
  13. C#版本websocket及时通信协议实现
  14. Google浏览器设置搜索打开新的标签页
  15. .net core web api 与httpclient发送和接收文件及数据
  16. Notification详解(含工具类)
  17. 在quartz的Job中获得Spring的WebApplicationContext或ServletContext
  18. docker官方windows安装
  19. webpack 安装以及使用
  20. UNIX网络编程读书笔记:recvmsg和sendmsg函数

热门文章

  1. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)
  2. ssm框架常见问题
  3. python抓包模块
  4. [Arc079F] Namori Grundy
  5. 利用Pastezort渗透win7
  6. OpenGL和GLSL版本更迭
  7. [Visual Studio] VS2012调试时很慢的解决方案
  8. Qt线程外使用Sleep
  9. HDU 3487 Play with Chain (splay tree)
  10. 【机器学习算法-python实现】决策树-Decision tree(2) 决策树的实现