博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode蠕动系列]Sort List
阅读量:6345 次
发布时间:2019-06-22

本文共 2223 字,大约阅读时间需要 7 分钟。

  这题前一阵子就看到了,一直没时间做,昨晚睡前想了想,要求n*log(n)以内的时间复杂度,第一时间想到的就是归并、快排和希尔排序(注:希尔排序时间为O(n^1.3),在数据量大于2的情况下小于n*log(n)),个人以为,链表的特性更适合归并,所以采用归并排序,实现的merge代码如下:

public static ListNode merge(ListNode rhead, ListNode lhead) {        ListNode head = null;        if (rhead.val <= lhead.val) {            head = rhead;            rhead = rhead.next;        }        else {            head = lhead;            lhead = lhead.next;        }        ListNode node = head;        while(rhead != null || lhead != null){             if (rhead == null) {                node.next = lhead;                lhead = lhead.next;              }             else if (lhead == null) {                 node.next = rhead;                 rhead = rhead.next;             }             else if (rhead.val <= lhead.val) {                 node.next = rhead;                 rhead = rhead.next;             }             else {                 node.next = lhead;                 lhead = lhead.next;             }             node = node.next;        }        return head;    }

  while中开始写为

if (rhead == null ||rhead.val <= lhead.val))  {...}else(..) {...}

  报NullPoint异常,问题在于:|| 会判断每一个条件,如果rhead = null,那么rhead.val 错误;

  然而这段代码在提交LeetCode时候报错:timeout, 修改while下代码:

while(rhead != null && lhead != null){            if (rhead.val > lhead.val) {               node.next = lhead;               lhead = lhead.next;             }            else if (lhead.val >= rhead.val) {                node.next = rhead;                rhead = rhead.next;            }            node = node.next;        }        if (rhead == null) {            while(lhead != null) {                node.next = lhead;                lhead = lhead.next;                node = node.next;                }        }        else if (lhead == null) {            while(rhead != null) {                node.next = rhead;                rhead = rhead.next;                node = node.next;            }        }

  代码没有之前简洁,但是一下子就accepted.

  但是对于这个问题一直耿耿于怀,然后google了下,给他跪了:time out is server's problem...

  再次提交前面代码,果然通过AC……

  但是对比下时间,后面的代码用时432ms,前面的代码用时476ms,除去每次运行的差异,个人认为,还一部分原因是:前面代码while每次都需要判断两个链表是否为null, 此处存在一定的时间开销,后面代码在一个链表为空以后,另一个链表只需不断迭代到为空。

转载于:https://www.cnblogs.com/C-paradox/p/3927796.html

你可能感兴趣的文章
怎么把Maven项目转为动态Web项目?
查看>>
Arm发布Cortex-A76AE自动驾驶芯片架构,宣示车载系统市场主权
查看>>
FreeBSD ports中make可带有的参数(转)
查看>>
Hibernate入门教程
查看>>
Java支付宝扫码支付[新]
查看>>
SpringMVC 拦截器 筛选
查看>>
CronExpression介绍
查看>>
第十八章:MVVM(八)
查看>>
点击表头切换升降序排序方式
查看>>
第26天,Django之include本质
查看>>
Java中静态变量和实例变量的区别
查看>>
秋名山老司机(详解)——bugku
查看>>
RED | Robot Framework集成开发环境
查看>>
育碧同 Mozilla 联手开发 AI 代码助手
查看>>
【实用】面对枯燥的源码,如何才能看得下去?
查看>>
智库说 | 徐远:数字时代的城市潜力
查看>>
《JSP极简教程》jsp c:forEach用法
查看>>
WebSocket详解(六):刨根问底WebSocket与Socket的关系
查看>>
用 Go 写一个轻量级的 ssh 批量操作工具
查看>>
网站设计之合理架构CSS 架构CSS
查看>>