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

链表中环的入口结点

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;
    }
};
全部评论

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务