【链表】若单链表存在环,如何找到环的入口点。

【算法】

这个完全是通过数学推导出来的,设一快、一慢两个指针,快指针的步长为2,慢指针为1,假设链表起点到环入口点之间的距离为x,环入口点到重合点的距离为y,假设在相遇之前慢指针走的s,则快指针必然走2s,所以有如下公式:

  1. s = x + y
  2. 2s = nr + s(假设环的周长为r,在相遇前快指针走了n圈)
由公式2推导出s = nr,带入公式1得到nr = x + y ===> x = nr -y;

现在再设两个指针p1、p2,步长均为1,p1从单链表起点开始遍历,p2从相遇点开始遍历(相遇点可以得到),根据公式x=nr-y,当p1移动x步时(移动到了入口处),p2移动了nr-y步,由于p2是从相遇点开始遍历的,故nr表示又回到了相遇点,-y表示倒退y步(表示入口点到相遇点的距离),由此可以得到p1和p2是同时到达入口点的。

故算法可以写为:
node* findEntry(node* head, node* encounter)
{
	node* p1 = head;
	node* p2 = encounter;
	
	while(p1 != p2)
	{
		p1 = p1->next;
		p2 = p2->next;
	}
	
	return p1;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值