牛客网剑指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描述:
![](https://img2020.cnblogs.com/blog/1288560/202003/1288560-20200328100131741-153427272.png)
stay foolish,stay hungry