牛客网剑指offer第54题——链表中环的入口节点

题目:

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

解答:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
       /* ListNode*p1;
      while(pHead != nullptr)
      {
        p1 =pHead->next;
        while(p1 != nullptr)
        {
            if(pHead == p1)
                return pHead;
            p1 = p1->next;
        }
          pHead = pHead->next;
      }
        return nullptr;*/
        set<ListNode*>node;
        pair<set<ListNode*>::iterator, bool> retpair;
        while(pHead != nullptr)
        {
          retpair=node.insert(pHead);
            if(retpair.second == false)
                return pHead;
            pHead = pHead->next;
        }
        return nullptr;
    }
};

这道题的简单思路是:

将环的入口问题看成是:在一个动态增长的数组中,找出第一个数值出现两次的数字。这样我们就可以将问题转换成利用set集合就可以解决。

set集合的插入:insert函数返回:pair<set<T>::iterator, bool>类型的变量。

也就是如果当前集合set中已经存在一个和要插入元素相同的元素,那么bool类型返回false。表明集合中已经存在该元素。利用这种思想,我们就可以轻松解决此问题。

 这里顺带补充一下《STL源码剖析》中对setde描述:

 

 

 
posted @ 2020-03-27 21:05  少年π  阅读(139)  评论(0编辑  收藏  举报