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

链表中环的入口结点

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

相关推荐

服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务