快慢指针判断是否有环,以及多少步有会相一次遇

快慢指针判断有环

int LinkList p =L;//快
int LinkList q =L;//慢
while(p->next!=NULL&&q!=NULL&&q!=NULL)
{	
	p = p->next->next;
	q = q->next;
	if(p==q)
		return 1;//有环
	return 0;
}

证明快慢指针会相遇

假设无环的部分有x个节点bai,有环部分有y个节点。慢指针du走t步与zhi快指针相遇。
那么慢指针在环中走的长度为t-x,快指针为2t-x(假设快指针每次走2)。
再假设慢指针在环中走过k1圈,快指针为k2圈。并在环中第n个地方相遇。
则慢指针在环中走的长度为k1y+n,快指针为k2y+n;
可得t-x=k1y+n
2t-x=k2
y+n
两式相减得t=(k2-k1)*y。所以可知慢指针走过y步后可第一次与快指针相遇,再过y步再相遇一次。并且在同一个地方相遇。

结论:每经过y(有环节点y个,y步)快慢指针会相遇

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值