📣 独立日限时特惠: VIP通行证立减$68
查看: 5874| 回复: 30
跳转到指定楼层
上一主题 下一主题
收起左侧

[二分/排序/搜索] leetcode sortList

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
Sort a linked list in O(n log n) time using constant space complexity.
/**
* Definition for singly-linked list.
* class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int x) {
*         val = x;
*         next = null;
*     }
* }
*/
class ListNode{
    int val;
    ListNode next;
    ListNode(int x){
        val = x;
        next = null;
    }
}
public class Solution {
    public ListNode sortList(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        if(head == null){
            return null;
        }
        
        ListNode pre = head;
        while(slow.next!=null && fast.next!=null && fast!=null){
            pre = slow;
            slow = slow.next;
            fast = fast.next.next;
        }
        pre.next = null;
        ListNode res = mergesort(head,slow);
        return res;
    }
   
    public ListNode mergesort(ListNode l1, ListNode l2){
        if(l2 == null || l1 == l2){
            return l1;
        }
        if(l1 == null){
            return l2;
        }
        ListNode slow = l1;
        ListNode fast = l1;
        ListNode pre = l1;
        while(slow.next!=null && fast.next!=null && fast!=null){
            pre = slow;
            slow = slow.next;
            fast = fast.next.next;
        }
        pre.next = null;
        ListNode head1 = mergesort(l1,slow);
        slow = l2;
        fast = l2;
        pre = l2;
        while(slow.next!=null && fast.next!=null && fast!=null){
            pre = slow;
            slow = slow.next;
            fast = fast.next.next;
        }
        pre.next = null;
        ListNode head2 = mergesort(l2,slow);
        ListNode res = new ListNode(0);
        ListNode cur = res;
        while(head1!=null && head2 != null){
            if(head1.val<head2.val){
                cur.next = head1;
                head1 = head1.next;
            }
            else{
                cur.next = head2;
                head2 = head2.next;
            }
            cur = cur.next;
        }
        while(head1!=null){
            cur.next = head1;
            cur = cur.next;
            head1 = head1.next;
        }
        while(head2!=null){
            cur.next = head2;
            cur = cur.next;
            head2 = head2.next;
        }
        return res.next;
    }
}
显示是runtime error, executed input为{},可是我对于head == null的情形已经有return null的指令了呀……求助

点评

你是否重复定义了class ListNode?如果这里的代码整体都是从leetcode上copy过来的话  发表于 2014-7-31 12:17

上一篇:求助,leetcode总是要我在成员申明后面加分号。
下一篇:斐波那契数列的时间复杂度计算
推荐
readman 2014-7-31 11:58:17 | 只看该作者
全局:
楼主, 我建议你先看下答案, 你上来自己写会导致错误的思维方式. 每个题都是有套路的. 都能归约成一系列问题.
你的code很散乱, 表示你不能把一道题归约到一类题...建议还是先从基础抓起

评分

参与人数 1大米 +3 收起 理由
donnice + 3 感谢指教,求问有没有leetcode答案集?

查看全部评分

回复

使用道具 举报

全局:
直接参考我的代码吧,  quick sort和merge sort都写了, 看注释。
你的代码太乱,不值得去花时间找bug。
  1. /**
  2. * Definition for singly-linked list.
  3. * class ListNode {
  4. *     int val;
  5. *     ListNode next;
  6. *     ListNode(int x) {
  7. *         val = x;
  8. *         next = null;
  9. *     }
  10. * }
  11. */
  12. public class Solution {
  13.     //quick sort
  14.     public ListNode sortList(ListNode head) {
  15.         if (head == null || head.next == null) return head;
  16.         int pivot = head.val;
  17.         ListNode h1 = new ListNode(-1);
  18.         ListNode hp = new ListNode(-1);
  19.         ListNode h2 = new ListNode(-1);
  20.         ListNode cur1 = h1;
  21.         ListNode curp = hp;
  22.         ListNode cur2 = h2;
  23.         ListNode cur = head;
  24.         while (cur != null) {
  25.             if (cur.val < pivot) {
  26.                 cur1.next = cur;
  27.                 cur1 = cur1.next;
  28.             } else if (cur.val > pivot) {
  29.                 cur2.next = cur;
  30.                 cur2 = cur2.next;
  31.             } else {
  32.                 curp.next = cur;
  33.                 curp = curp.next;
  34.             }
  35.             cur = cur.next;
  36.         }
  37.         cur1.next = null;
  38.         curp.next = null;
  39.         cur2.next = null;
  40.         
  41.         return append(append(sortList(h1.next), hp.next), sortList(h2.next));
  42.     }
  43.    
  44.     private ListNode append(ListNode h1, ListNode h2) {
  45.         if (h1 == null) return h2;
  46.         if (h2 == null) return h1;
  47.         
  48.         ListNode cur = h1;
  49.         while (cur.next != null) cur = cur.next;
  50.         cur.next = h2;
  51.         
  52.         return h1;
  53.     }

  54. /* merge sort
  55.     public ListNode sortList(ListNode head) {
  56.         if (head == null || head.next == null) return head;
  57.         ListNode dummy = new ListNode(-1);
  58.         dummy.next = head;
  59.         ListNode h1 = dummy;
  60.         ListNode h2 = dummy;
  61.         
  62.         while (h2 != null && h2.next != null) {
  63.             h1 = h1.next;
  64.             h2 = h2.next.next;
  65.         }
  66.         
  67.         h2 = h1.next;
  68.         h1.next = null;
  69.         h1 = head;
  70.         
  71.         return merge(sortList(h1), sortList(h2));
  72.     }
  73.    
  74.     private ListNode merge(ListNode l1, ListNode l2) {
  75.         if (l1 == null) return l2;
  76.         if (l2 == null) return l1;
  77.         ListNode result = new ListNode(-1);
  78.         ListNode curNode = result;
  79.         while (l1 != null && l2 != null) {
  80.             if (l1.val > l2.val) {
  81.                 curNode.next = l2;
  82.                 l2 = l2.next;
  83.             } else {
  84.                 curNode.next = l1;
  85.                 l1 = l1.next;
  86.             }
  87.             curNode = curNode.next;
  88.         }
  89.         
  90.         if (l1 != null) curNode.next = l1;
  91.         if (l2 != null) curNode.next = l2;
  92.         
  93.         return result.next;
  94.     }
  95. */
  96. }
复制代码

点评

没说到关键, 事实上dummy是为了easy implement而非别的, 找中间点2个还是1个make no difference  发表于 2014-8-2 17:51
现在每次需要两个指针h1和h2 scan linked-list,还有dummy,如果把长度记下来递归传下去,就可以一个指针找到中间节点了  发表于 2014-8-2 07:53
不懂你在说啥? 啥长度? 啥count?  发表于 2014-7-31 12:36
linked list不能直接取长度,不过既然之前已经scan了一遍,不妨把count也记下来之后可以用,这样可以节省时间,虽然整体复杂度不变  发表于 2014-7-31 12:28

评分

参与人数 1大米 +3 收起 理由
donnice + 3 希望你能教我怎么复制代码

查看全部评分

回复

使用道具 举报

全局:
Kimurate 发表于 2014-8-2 12:11
我就是说实现很tricky……思想当然简单……

我仔细读了一下这个非递归的版本, 直觉上这个版本的代价是基于一些常数时间复杂度代价的(最里层1 - interval的循环), 还有一些不好计算overhead。 为了验证猜测我提交测了一下, 比我的递归版本要慢了100+ 毫秒。

0 minutes ago        Accepted        472 ms        java
1 minute ago        Accepted        580 ms        java

一般来说递归进栈出栈需要的时间代价更大,空间复杂度logn更高那么对内存的开辟消耗也更多, 所以非递归版本速度一般是要高于递归版本,但是这个例子中为了实现理论上O(1)的空间而导致速度上反而不如,感觉失去了初衷。不知道还有更好或者更简洁的非递归实现版本没有, 我猜用一个(head, end)的二元组数据结构表示链表会有更好的效果。
回复

使用道具 举报

🔗
ilnlh 2014-7-31 11:52:12 | 只看该作者
全局:
本帖最后由 ilnlh 于 2014-7-30 19:56 编辑

先把代码贴贴好吧,你这里好多重复内容,确定你就这么写的吗。。。 另外用一下代码标签格式化,看上去也清楚很多。。。
看了下貌似真的是你原来的代码,不过推荐还是先多看看别人的代码,思考一下怎么精炼自己的;你现在这样就使劲练习的话,让我想起当时考GRE一个新东方作文老师说的,最后会把错误的表达方式练得炉火纯青了

评分

参与人数 1大米 +3 收起 理由
donnice + 3 感谢指教

查看全部评分

回复

使用道具 举报

🔗
 楼主| donnice 2014-7-31 14:37:16 | 只看该作者
全局:
ilnlh 发表于 2014-7-31 11:52
先把代码贴贴好吧,你这里好多重复内容,确定你就这么写的吗。。。 另外用一下代码标签格式化,看上去也清 ...

我确实很想要一份leetcode的参考答案,但一直都找不到……这边有链接么
回复

使用道具 举报

🔗
 楼主| donnice 2014-7-31 14:38:02 | 只看该作者
全局:
readman 发表于 2014-7-31 11:58
楼主, 我建议你先看下答案, 你上来自己写会导致错误的思维方式. 每个题都是有套路的. 都能归约成一系列问题 ...

同上
顺便其实这已经是我参考别人的答案了,就是最普通的mergesort而已
回复

使用道具 举报

🔗
 楼主| donnice 2014-7-31 14:38:54 | 只看该作者
全局:
北美农民 发表于 2014-7-31 12:12
直接参考我的代码吧,  quick sort和merge sort都写了, 看注释。
你的代码太乱,不值得去花时间找bug。

你的解法和我的完全一样,惟一的区别就是你是复制了代码
回复

使用道具 举报

🔗
 楼主| donnice 2014-7-31 14:40:05 | 只看该作者
全局:
北美农民 发表于 2014-7-31 12:12
直接参考我的代码吧,  quick sort和merge sort都写了, 看注释。
你的代码太乱,不值得去花时间找bug。

顺便能问问是怎么复制代码的么
回复

使用道具 举报

🔗
weixc1234 2014-7-31 15:23:49 | 只看该作者
全局:
donnice 发表于 2014-7-31 14:40
顺便能问问是怎么复制代码的么

leetcode答案:https://github.com/soulmachine/leetcode

github是个好东西,嗯
回复

使用道具 举报

🔗
 楼主| donnice 2014-7-31 15:57:29 | 只看该作者
全局:
weixc1234 发表于 2014-7-31 15:23
leetcode答案:https://github.com/soulmachine/leetcode

github是个好东西,嗯

诶,貌似只找到了C++的版本……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表