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

链表中环的入口结点

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-20 12:08
已编辑
江南大学 图像识别
机械牛马勇闯秋招:把校园经历里面做过的项目,大作业,课设,毕设啥的,扩写,写成具体的项目经历,自我评价缩写别占篇幅,不然这简历真没东西,初筛都过不了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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