LeetCode Linked List Cycle

本文介绍了一种使用快慢指针的方法来判断链表是否存在环,并进一步讨论了如何计算环的长度及找到环的起始位置。

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

Given a linked list, determine if it has a cycle in it.

Follow up:
Can you solve it without using extra space?

题意:如何判断链表是否有环

这是一个经典的问题,后面还有追问:

如果有环,计算环的长度?

找到碰撞点的位置?

 

首先,如何找环,设计两个指针,分别从链表的头节点开始,走一部和走两步,循环一直到走两步指针为空(说明没有环)或者两指针相遇(说明有环)为止。

主要代码:

/**
 * 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) {
        if(head==null)
    		return false;
        ListNode p1,p2;
        p1=head;
        p2=head;
        boolean ifcycle = false;
        while(p2.next!=null&&p2.next.next!=null)
        {
        	p1=p1.next;
        	p2=p2.next.next;
        	if(p1==p2)
        	{
        		ifcycle = true;
        		break;
        	}
        }
        return ifcycle;
    }
}

 如何计算环的长度:如下图:



 第一次相遇时,走两步的指针总共路程为: S(两步)=圆周+S1+S2 ;走一步的指针路程为 S(一步)=S1+S2 ; 所以环长度为 S(两步)-S(一步)

 

如何找到碰撞点的位置:

由于走两步指针的路程为走一步指针所走路程的两倍,S(两步)=2(S1+S2),再根据第二个公式,可以得出S(圆周)= S1+S2 ; 在这个公式中S2这段是重复的,也就是说从碰撞点开始继续向前走到环入口点的距离和从链表头结点走到入口点的距离是相等的。我们只需要设定两个指针分别从头结点和碰撞点开始每次走一步,相遇点就是环入口点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值