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

链表中环的入口结点

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

解题步骤:
1.使用快慢指针,找到在环中的相遇结点(快指针一下走2步,慢指针一下走一步)
2.在环中走一圈,统计环中的结点个数n(在环中走,不会走出去,再次回到初始结点为一圈)
3.定义两个指针,一个指针先走n步,另一个指针指向头结点,
--然后一步步的往下走,相遇时,走了n步的指针,刚好走了一圈,也就是相遇结点为环入口

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    /*
    解题步骤:
    1.使用快慢指针,找到在环中的相遇结点
    2.在环中走一圈,统计环中的结点个数n
    3.定义两个指针,一个指针先走n步,另一个指针指向头结点,
    --然后一步步的往下走,相遇时,走了n步的指针,刚好走了一圈,也就是相遇结点为环入口
    */
    //先找到相遇的节点
    ListNode* FindMeetNode(ListNode* pHead){
        if(pHead == NULL){
            return NULL;
        }
        ListNode* slow = pHead->next;
        if(slow == NULL){
            return NULL;
        }
        ListNode* fast = slow->next;
        while(fast != NULL && slow != NULL){
            if(fast == slow){
                return slow;
            }
            slow = slow->next;
            fast = fast->next;
            if(fast != NULL){
                fast = fast->next;
            }
        }
        return NULL;
    }

    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        ListNode* meetNode = FindMeetNode(pHead);
        if(meetNode == NULL){
            return NULL;
        }
        ListNode* p = meetNode->next;
        int count = 1;
        //算出环的结点数
        while(p != meetNode){
            count++;
            p = p->next;
        }
        //算出环入口
        p = pHead;
        ListNode* pt = pHead;
        //先走count步
        while(count--){
            p = p->next;
        }
        while(pt != p){
            pt = pt->next;
            p = p->next;
        }
        return p;

    }
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务