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

链表中环的入口结点

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;

    }
};
全部评论

相关推荐

头像
10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务