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

链表中环的入口结点

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

比较固定的解法。先判定给定链表是否有环,若有则进而找环入口。
使用快慢指针来判断链表是否有环。两指针都从头结点开始,快指针一次走两步,慢指针一次走一步,若两指针相遇,则有环,若其中一个指针为null,则无环。
当链表中有环时,将两指针的其中一个指向头结点,另一指针继续指向相遇结点,然后两指针每次走一步,最终必定在环入口结点处相遇。
这个结论是通过数学证明得到的,感兴趣的朋友可以自己尝试。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        ListNode* fast = pHead;
        ListNode* slow = pHead;
        bool hasRing = false;
        if(fast->next && slow->next && fast->next->next){
            fast = fast->next->next;
            slow = slow->next;
        }
        while(fast->next && slow->next && fast->next->next){
            if(fast == slow){
                hasRing = true;
                break;
            }
            fast = fast->next->next;
            slow = slow->next;
        }
        if(hasRing){
            fast = pHead;
            while(hasRing){
                if(fast == slow){
                    return fast;
                }
                fast = fast->next;
                slow = slow->next;
            }
        }
        return nullptr;
    }
};
全部评论

相关推荐

2024-12-23 06:50
门头沟学院 Java
给点吧求求了:3点发的帖子,害怕😰
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务