题解 | #链表中环的入口结点#

链表中环的入口结点

https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4

快慢指针解题

在指针向后迭代的过程中,快指针比慢指针快一倍,把链表长度顺序切割为:

头节点到入口节点:a
入口节点到相遇节点:b
相遇节点到入口节点:c
可得以下公式

2(a+b) = a+b+c+b
=>	 a = c

思路是:相遇后快指针指向头节点,并且速度平齐慢指针

class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        //成环前提 至少两个以上节点
        if(pHead==nullptr||pHead->next==nullptr){
            return nullptr;
        }                                                                                                     
        ListNode* fast = pHead;
        ListNode* slow = pHead;

        while(fast){
            slow = slow->next;    // 慢指针走一步
            if(fast->next == nullptr) return nullptr;    // 若快指针的下一步不能走,则说明两指针不会相遇
            fast = fast->next->next;    // 快指针向后走两步
            if(fast == slow){    // 找到相交节点, 此时慢指针已经走了nb步
                fast = pHead;    // 快指针重新移动到头
                while(fast != slow){    // 直到两指针相遇位置,每次向后走一步
                    fast = fast->next;
                    slow = slow->next;
                }
                return fast;    // 找到入口节点,直接返回
            }
        }
        return nullptr;
    }
};
全部评论

相关推荐

在笔试的大西瓜很矫健:校招数分不用想了,这经历和学历都不够用,大厂更别想,初筛都过不了,说点不好听的小厂数分都进不去(小厂也是假数分),要两个对口实习+3个项目(或者3+2),而且要有含金量才能补一点你的学历劣势。 建议刷实习,社招找数分,校招看运气,能入行业就行,可以运营转数分
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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