[LeetCode]Linked List Cycle

本文介绍了一种使用快慢指针的方法来检测链表中是否存在环。通过让一个指针每次移动一步而另一个指针每次移动两步的方式,如果链表中有环,则两个指针最终会在环内相遇。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Given a linked list, determine if it has a cycle in it.Can you solve it without using extra space?
给你一个链表,确定它是否有环的存在。最好不使用额外的空间

解题思路

采用“快慢指针”查检查链表是否含有环。让一个指针一次走一步,另一个一次走两步,如果链表中含有环,快的指针会再次和慢的指针相遇。
它的原理是什么呢?用通俗的话来讲:


一段带环的跑道,L1为直线跑道,L2为环形跑道,进入环形跑道后会一直绕圈跑,A速度为B速度的2倍,一起出发,最终A和B会跑过一段共有距离L1,当B进入L2后必会和A再次相遇。

如果L2不为环形,当A跑完L2段则结束,远超B跑的距离,不会和B相遇。

代码

/**
 * 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 slowNode = head;  
        ListNode fastNode = head;  
          
        while(fastNode != null && fastNode.next != null) {  
            slowNode = slowNode.next;  
            fastNode = fastNode.next.next;  
            if(slowNode == fastNode)  
                return true;  
        }  
        return false;  
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值