ORID28

作者: Wilbur_ | 来源:发表于2020-06-14 23:24 被阅读0次

原来java 里面 || 左边和右边还是有一定区别的,因为它是从左往右边执行,所以你在判断条件的时候不能先用一个以右边为前提的条件去判断左边,因为这容易导致null pointer exception,比如 if (list.next.next == null || list == null ) {return false} 这种判断,那就会导致null pointer exception, 因为list 本身可能就是null,所以你在执行左边的时候就会导致null pointer exception,但是如果你把他们两个位置换一下,则不会出现这种问题。

[142] Linked List Cycle II解题报告

算法

用什么算法
龟兔赛跑(网上说是Floyd's algo) 我觉得其实只要理解了快,慢两个指针就好了。
为什么用这个算法(那些条件)
当你需要找到一个Linked List里面是否有循环的时候,你就需要用两个指针来找,一个走得快,一个走的慢,快的走两步,慢的走一步。然后当他们相遇的时候,证明这个Linked List有循环(否则快的指针会先走到Null pointer上面)。所以这也是判断条件之一,这个题前面一道就是判断是否有循环。这道题是那道题的进阶版,要你返回进入循环的node。要做到这点,你需要明白当快指针第一次与慢指针相遇的时候,快指针走了a+2b+c,慢指针走了a+b。而快指针的速度是慢指针的两倍,你也可以用a+2b+c == 2(a+b) 来表示,这样你就得到了a==c的结论(也就是说你能通过新开启一个头部指针,然后他走的距离和两个指针走到loop开始的距离一样,当他们相遇的时候,确保这个是loop的起点)
leetcode上面这个人解释的很好,我把截图放在这里了。


leetcode 解答

代码实现

有什么要注意的地方
有什么可以优化的地方

时空复杂度分析

...

相关题目有哪些做过的

跟哪个题目比较像?

[287] Find the Duplicate number解题报告

算法

用什么算法
龟兔赛跑(快慢指针)
为什么用这个算法(那些条件)
因为找到一个array里面的重复点根在linked list里面找循环是相同的概念,你要通过在int[] nums 用两个指针来走,int slow = nums[0]; int fast = nums[0];
只不过在while 循环里面fast 每次走两个,也就是fast = nums[nums[fast]],这样他会比慢指针走快一步,这时候当他俩首次相遇的时候,就跟上面那道题一摸一样了,因为你找到了循环,然后他们可能在循环的某一个点遇到了,这时候重新设置一个头指针,然后头指针一步步走的距离就是现在快慢指针重合地方到循环起点的距离
a+2b+c ==2(a+b)
这时候再重新走一次就可以找出起点了。

代码实现

有什么要注意的地方
有什么可以优化的地方

时空复杂度分析

...

相关题目有哪些做过的

跟哪个题目比较像?

相关文章

  • ORID28

    原来java 里面 || 左边和右边还是有一定区别的,因为它是从左往右边执行,所以你在判断条件的时候不能先用一个以...

网友评论

      本文标题:ORID28

      本文链接:https://www.haomeiwen.com/subject/bazztktx.html