1.题目描述:

2.解题思路:

  本题是要堆一个链表进行排序,并且要求时间复杂度为 O(n log n)。很明显,要用到分治的思想,用二分法进行归并排序:找到链表的middle节点,然后递归对前半部分和后半部分分别进行归并排序,最后对两个已排好序的链表进行Merge。

  分为三步:

  (1)找到中间结点,将链表分割成两部分。这里用到快慢两个指针的方法。

  (2)对前后每一部分分别进行归并排序。这里用到递归。

  (3)对两个已排好序的链表进行合并。这里用到前面merge 2 list的方法。

  

3.Java代码:

//public class LeetCode148 为测试代码
public class LeetCode148 {
public static void main(String[] args) {
ListNode n1=new ListNode(3),n2=new ListNode(2),n3=new ListNode(1),n4=new ListNode(5);
ListNode p=n1;
n1.next=n2;
n2.next=n3;
n3.next=n4;
System.out.print("初始时链表:"+p.val);
while(p.next!=null){
System.out.print("->"+p.next.val);
p=p.next;
}
System.out.println();
ListNode head=new Solution().sortList(n1);
System.out.print("排序后链表:"+head.val);
while(head.next!=null){
System.out.print("->"+head.next.val);
head=head.next;
}
}
} //class Solution为ac代码
class Solution {
public ListNode sortList(ListNode head) {
if(head==null||head.next==null) return head;
// step 1. 将链表分割为两部分
ListNode pre=null,slow=head,fast=head;
while(fast!=null&&fast.next!=null){
pre=slow;//pre指针是为了记住slow的前一个节点位置
slow=slow.next;
fast=fast.next.next;
}
pre.next=null;//将链表从pre和slow之间断开
// step 2. 对每一部分进行排序
ListNode l1=sortList(head);
ListNode l2=sortList(slow);
// step 3. merge l1 and l2
return merge2Lists(l1,l2);
} private ListNode merge2Lists(ListNode l1, ListNode l2) {
ListNode fakeHead=new ListNode(0);
ListNode p=fakeHead;
while(l1!=null&&l2!=null){
if(l1.val<l2.val){
p.next=l1;
l1=l1.next;
}else{
p.next=l2;
l2=l2.next;
}
p=p.next;
}
if(l1!=null) p.next=l1;
if(l2!=null) p.next=l2;
return fakeHead.next;
}
}
class ListNode{
int val;
ListNode next;
ListNode(int x) { val = x; }
}

测试结果:

思考:我将merge2Lists方法写成递归的写法时,即

 private ListNode merge2Lists(ListNode l1, ListNode l2) {
if(l1==null) return l2;
if(l2==null) return l1;
if(l1.val<l2.val){
l1.next=merge2Lists(l1.next, l2);
return l1;
}else{
l2.next=merge2Lists(l1, l2.next);
return l2;
}
}

这时在eclipse上测试完全没问题,但是在LeetCode上提交不通过,至今没想明白说明问题,如果哪位大神明白为什么,一定告诉我。。。

【LeetCode148】Sort List★★bug的更多相关文章

  1. 【LeetCode】Sort Colors 解题报告

    [题目] Given an array with n objects colored red, white or blue, sort them so that objects of the same ...

  2. 【LeetCode】Sort Colors

    Sort Colors Given an array with n objects colored red, white or blue, sort them so that objects of t ...

  3. 【leetcode】Sort Colors(middle)☆

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  4. 【leetcode】Sort List (middle)

    Sort a linked list in O(n log n) time using constant space complexity. 思路: 用归并排序.设输入链表为S,则先将其拆分为前半部分 ...

  5. 【leetcode】Sort List

    Sort List Sort a linked list in O(n log n) time using constant space complexity.   需要采用归并排序对链表进行操作. ...

  6. 【shell】sort命令

    [root@andon ~]# sort 1 ##常用正序自动排序 101 paul 18 100 102 suan 11 99 103 peter 18 98 id name age score [ ...

  7. 【Leetcode】Sort List JAVA实现

    Sort a linked list in O(n log n) time using constant space complexity. 1.分析 该题主要考查了链接上的合并排序算法. 2.正确代 ...

  8. 【原】从一个bug浅谈YUI3组件的资源加载

    篇前声明:为了不涉及业务细节,篇内信息统一以某游戏,某功能代替 前不久,某游戏准备内测客户端,开发人员测试过程中发现某功能突然不灵了,之前的测试一切ok,没有发现任何异常,第一反应是,游戏内浏览器都是 ...

  9. 【POJ】2492 A bug's life ——种类并查集

    A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 28211   Accepted: 9177 De ...

随机推荐

  1. JQuery 节点监听

    DOMSubtreeModified: 在DOM结构发生任何变化的时候.这个事件在其他事件触发后都会触发: $(".attr_box").bind("DOMSubtree ...

  2. C#加解密算法

    先附上源码 加密解密算法目前已经应用到我们生活中的各个方面 加密用于达到以下目的: 保密性:帮助保护用户的标识或数据不被读取. 数据完整性:帮助保护数据不被更改. 身份验证:确保数据发自特定的一方. ...

  3. Android--自定义弹出框-自定义dialog

    项目要用到弹出框,还要和苹果的样式一样(Android真是没地位),所以就自己定义了一个,不是很像(主要是没图),但是也还可以. 废话不多说了,直接上代码 1.先看布局文件 <?xml vers ...

  4. Problem5-Project Euler

    Smallest multiple   2520 is the smallest number that can be divided by each of the numbers from 1 to ...

  5. XML与DataSet的相互转换

    转:https://www.cnblogs.com/kunEssay/p/6168824.html XML与DataSet的相互转换的类 一.XML与DataSet的相互转换的类 using Syst ...

  6. sql Server插不进数据,以及Id自增的教程及注意事项

    参考于:https://jingyan.baidu.com/article/fec4bce244f902f2608d8b7a.html 使用SQL Server 2014 数据库做web的项目出现错误 ...

  7. Windows2003系统如何设置能让两个人共用一个桌面同时远程控制?

    在windows 2003上,可以两人同时同一桌面控制一台服务器,交流非常方便. 解决方案: 两人都用终端远程登陆到服务器上,其中一人在“开始”--“管理工具”--“终端服务管理器”,选中对方的用户名 ...

  8. 简单了解Tomcat与OSGi的类加载器架构

    前言: 本次博客主要是对Tomcat与OSGi的类加载器架构,所以就需要对tomcat.OSGi以及类加载机制有所了解 类加载可以在http://www.cnblogs.com/ghoster/p/7 ...

  9. Android的.so文件、ABI和CPU的关系

    Android的.so文件.ABI和CPU的关系有篇文章描述的很详细了 见 http://blog.csdn.net/xx326664162/article/details/51163905

  10. SQL删除指定条件的重复数据,只保留一条

    BEGIN DELETE TB FROM TableName TB WHERE TB.ID IN (SELECT MIN(ID) FROM TableName TB2 GROUP BY TB2.Col ...