题解 | #链表中环的入口结点#
链表中环的入口结点
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;
    }
};
 投递深信服等公司10个岗位
投递深信服等公司10个岗位 阿里巴巴公司氛围 653人发布
阿里巴巴公司氛围 653人发布