美文网首页面试精选
LeetCode刷题分类之双指针141.环形链表

LeetCode刷题分类之双指针141.环形链表

作者: 逍遥白亦 | 来源:发表于2021-03-15 21:29 被阅读0次

    141. 环形链表

    题目

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

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

    示例 1:

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

    思路

    算法

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

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

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

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

    代码

    /**
     * Definition for singly-linked list.
     * class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) {
     *         val = x;
     *         next = null;
     *     }
     * }
     */
    public class Solution {
        public boolean hasCycle(ListNode head) {
            ListNode fastPoint, slowPoint;
            fastPoint = head;
            slowPoint = head;
            boolean isLoop = false;
            while( fastPoint != null && fastPoint.next != null){
                slowPoint = slowPoint.next;
                fastPoint = fastPoint.next.next;
                if( slowPoint == fastPoint){
                return true;
                }
            }
    
            return false;
        }
    }
    

    相关文章

      网友评论

        本文标题:LeetCode刷题分类之双指针141.环形链表

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