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

链表中环的入口结点

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

解法:快慢指针;

当两个指针进入环后有一个相遇结点,慢指针走了X+Y,因为快指针走的长度是慢指针的两倍,所以快指针走了2*(X+Y)。现在求相遇结点到入口结点的距离:2*(X+Y)-X-Y-Y=X; 所以我们发现,(相遇结点到入口节点的距离) == (头指针到入口结点的距离),那么此时只需要将快指针返回头指针,然后一步一步走,而慢指针也一步一步走,两个指针第二次相遇的结点就是入口结点。

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

相关推荐

07-29 14:37
门头沟学院 Java
点赞 评论 收藏
分享
07-11 22:27
中南大学 Java
程序员牛肉:学历的话没问题。但是没问题的也就只有学历了。 其实你的整体架构是正确的,博客接着干。但是项目有点过于简单了。从后端的角度上讲,你这也就是刚入门的水平,所以肯定约面试够呛。 如果你要应聘后端岗位,那你第一个项目竟然是仿写操作系统。这个你要面试官咋问你。你一定要记住一点,你简历上写的所有的东西,都是为了证明你有能力胜任当前的岗位,而不是为了证明你自己会什么。 如果你只是浅浅的做几个项目,描述也都是烂大街。技术点也都是各种混水类的配置类需求,那你就不要幻想自己能走多远。一定要保持思考,保持学习。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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