链表中环的入口节点

链表中环的入口节点

https://www.nowcoder.com/practice/6e630519bf86480296d0f1c868d425ad?tpId=117&&tqId=34924&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking

利用快慢指针方法判断链表是否存在环,并记录两指针相遇位置。
题目描述:对于一个给定的链表,返回环的入口节点,如果没有环,返回null

参照下图,假设图中存在环且快慢指针在C处相遇,设|AB|=a, |BC|=b, |CB|=c,有2(a+b)=a+b+n(b+c),推出a=n(b+c)-b,因此让两个指针分别从A和C以相同速度前进,两个指针再次相遇的位置即为环的入口节点。
图片说明
代码如下:

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if(!head) return nullptr;
        ListNode *l1 = head;
        ListNode *l2 = head;
        while(l2 && l2->next){
            l1 = l1->next;
            l2 = l2->next->next;
            if(l1 == l2){
                l2 = head;
                while(l2 != l1){
                    l2 = l2->next;
                    l1 = l1->next;
                }
                return l1;
            }
        }
        return nullptr;
    }
};
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务