剑指offer 链表中环的入口位置

题目描述

一个链表中包含环,请找出该链表的环的入口结点。
 
思路:这题需要知道a = c,然后head和slow每次走一步,相遇的时候就是第一个入口交点,

注意:for循环或者while循环之后,一定要判断是是否正常退出,是找到满足条件的break退出,还是不满足for循环条件退出,加一个判断。

 

 

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/

class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead){
        if(pHead == nullptr || pHead -> next == nullptr){
            return nullptr;
        }
        ListNode* fast = pHead;
        ListNode* slow = pHead;
        //find fast = slow
        while(fast != nullptr && fast -> next != nullptr){            
            fast = fast -> next -> next;
            slow = slow -> next;
            if(fast == slow){
                break;
            }
        }
        if(fast == nullptr || fast -> next == nullptr){//这里一定要判断是否是正常退出
            return nullptr;
        }
        fast = pHead;
          while(fast != slow){
            fast = fast -> next;
            slow = slow -> next;
        }
        if(fast == slow){//这里一定要判断是否是正常退出
            return slow;
        }
        return nullptr;
    }
    
};

 

posted @ 2017-09-12 15:08  zqlucky  阅读(147)  评论(0编辑  收藏  举报