如何找到带环链表的入口节点?

本文介绍了两种方法来找到带环链表的入口节点。第一种方法使用快慢指针找到环内的相遇点,然后断开链表。第二种方法是在找到环内节点后,再从头节点开始的指针与环内节点同步移动,它们相遇的点即为入口节点。
摘要由CSDN通过智能技术生成

2种思路:
首先我们假设有个带环链表list1,如图我们可以这么做:
这里写图片描述
这样问题就转换成了如何求出2个不带环链表的相交节点

很明显你会问如何在环中找到一个节点,你不可能去遍历(会死循环),有这样一个办法,我们设置一个快慢指针first,second,快指针一次走2个节点,慢指针一次走一个节点,那么它们最终在环内相遇。

你会问:如果快指针每次都跳过慢指针那?
当然不会。
证明如下:
我们可以利用反证法:假设快指针会跳过慢指针

假设在一次移动后在first在second的前一个点,即first跳过second,那么我们使first,second各向后移动一次,first与second重合,即它们在之前已经相遇,原命题错误。

那我们可以写出这段代码:

       ListNode *first  = pHead;
       ListNode *second = pHead;
        //判断条件是为了判断链表是否带环
        while ( first && first->next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值