码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-09-29 20:14:15      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:有一个   哈希表   span   指针   pos   结果   while循环   节点   需要   

①中文题目

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

为了表示给定链表中的环,我们使用整数 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 (环形链表)(链表)

标签:有一个   哈希表   span   指针   pos   结果   while循环   节点   需要   

原文地址:https://www.cnblogs.com/zf007/p/11609535.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!