[LeetCode蠕动系列]Sort List
这题前一阵子就看到了,一直没时间做,昨晚睡前想了想,要求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, 此处存在一定的时间开销,后面代码在一个链表为空以后,另一个链表只需不断迭代到为空。

浙公网安备 33010602011771号