[LC]141题 Linked List Cycle (环形链表)(链表)

Posted zf007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LC]141题 Linked List Cycle (环形链表)(链表)相关的知识,希望对你有一定的参考价值。

①中文题目

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

 

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

技术图片

 

 


示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

技术图片

 

 


示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。


技术图片

 

 

②思路

    我自己想到了用快慢指针,但是用错了,于是抄了官方题解,它的思路如下:

    想象一下,两名运动员以不同的速度在环形赛道上跑步会发生什么?

    

   通过使用具有 不同速度 的快、慢两个指针遍历链表,空间复杂度可以被降低至 O(1)O(1)。慢指针每次移动一步,而快指针每次移动两步。

   如果列表中不存在环,最终快指针将会最先到达尾部,此时我们可以返回 false。

  现在考虑一个环形链表,把慢指针和快指针想象成两个在环形赛道上跑步的运动员(分别称之为慢跑者与快跑者)。而快跑者最终一定会追上慢跑者。这是为什么呢?考虑下面这种情况(记作情况 A)- 假如    快跑者只落后慢跑者一步,在下一次迭代中,它们就会分别跑了一步或两步并相遇。

   其他情况又会怎样呢?例如,我们没有考虑快跑者在慢跑者之后两步或三步的情况。但其实不难想到,因为在下一次或者下下次迭代后,又会变成上面提到的情况 A。

③代码

 1 public class Solution {
 2     public boolean hasCycle(ListNode head) {
 3         if (head == null || head.next == null) {
 4          return false;
 5         }
 6         ListNode slow = head;   //慢指针
 7         ListNode fast = head.next;   //快指针
 8         while (slow != fast) {
 9         if (fast == null || fast.next == null) {   //因为快指针1次走两步,所以很可能一步恰大了。
10             return false;                        //所以,需要fast == null || fast.next == null一起来判定
11         }
12         slow = slow.next;      //慢指针一次走1步,
13         fast = fast.next.next;  //快指针1次走2步,
14         }
15         return true;
16     }
17 }

 

④运算结果 通过

执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗 :37.3 MB, 在所有 Java 提交中击败了96.99%的用户

⑤学到的知识

    1、并不是只有

1 for(i=0;i...){
2    for(j=i;j...){
3          .....
4     }
5 }

  这种叫快慢指针。而是如上述代码里的12,13行,让快的指针比慢指针每次多走1不,那也叫快慢之分。

   2、我自己写的快慢指针里面,不知道怎么从while循环里出来,,,导致不知道慢指针什么时候后移1位。现在学到了

   直接判断

while (slow != fast)

就是判断进、出循环的方法。

 

⑥ 这个题,官方解答里还有用哈希表的。我暂时用不来哈希表,准备以后再来用哈希表做做这个题。



以上是关于[LC]141题 Linked List Cycle (环形链表)(链表)的主要内容,如果未能解决你的问题,请参考以下文章

LC_141. Linked List Cycle

[LC]141题 Intersection of Two Linked Lists (相交链表)(链表)

Leetcode 141题 环形链表(Linked List Cycle) Java语言求解

LeetCode141 Linked List Cycle. LeetCode142 Linked List Cycle II

[LC]203题 Remove Linked List Elements (移除链表元素)(链表)

141.Linked List Cycle