剑指OFFER_链表中环的入口节点
剑指OFFER_链表中环的入口节点
题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路
我的思路效率不是很高,就是遍历这个链表,同时把节点地址存进容器,然后判断新的节点地址是否已经访问过,如果是则表示是一个环,返回此地址;
不过我的容器选择有点不好,我用的vector,还自己写了一个搜索是否访问的函数,但是其实用set效率会更高,把两份代码都贴出来:
代码-vector版本
typedef vector<ListNode*> vec;
class Solution {
public:
bool findNode(vec &v, ListNode *node) {
for (ListNode *n:v) {
if (n==node) {
return true;
}
}
return false;
}
ListNode* EntryNodeOfLoop(ListNode* pHead) {
ListNode *ans = nullptr;
ListNode *node = pHead;
vec v;
while (node) {
if (findNode(v, node)) {
return node;
}
v.push_back(node);
node = node->next;
}
return ans;
}
};
代码-set版本
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
unordered_set<ListNode*> st;
while (pHead) {
if (st.find(pHead) == st.end()) {
st.insert(pHead);
pHead = pHead->next;
}
else {
return pHead;
}
}
return nullptr;
}
};