一个链表中包含环,请找出该链表的环的入口结点。

链接:https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4
来源:牛客网

思路:leetcode上也有这道题,具体思想是,两个指针fast和slow,fast以slow两倍速度前进,
如果没有环,那么fast和slow不会相遇此时返回null;如果有环,那fast和slow肯定会再次相遇
相遇的时候,fast刚好比slow多走了一圈环的长度。  用图来描述下,当fast与slow相遇时,fast走过的距离为a + b + c + b,而slow走过的距离为
a + b,因为fast是slow速度的两倍,则有a+b+c+b = 2*(a+b),登出a=c;此时slow节点所处X处
到环起点Y处的距离a和X节点到Y处距离c其实是相等的,此时第三个指针p从x处,以和slow指针
相同的速度前进,当它两相遇时,即为环的起点Y处!
 java:
public class Solution {
 
    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        ListNode fast = pHead;
        ListNode slow = pHead;
        while(fast !=null && fast.next !=null) {
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow) {
                ListNode p = pHead;
                while( p != slow) {
                    p = p.next;
                    slow = slow.next;
                }
                return p;
            }
        }
        return null;
    }
}

  c++

/*
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;
         
        while(fast!=NULL&&fast->next!=NULL){
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow){
                ListNode*p=pHead;
                while(p!=slow){
                    p=p->next;
                    slow=slow->next;
                }
                return p;
       
            }
        }
        return NULL;  
 
    }
};

  

posted @ 2017-06-09 23:26  czcColud  阅读(522)  评论(0编辑  收藏  举报