面试题:链表中环的入口节点
2018-01-29 22:59
267 查看
如果一个链表包含环,如何找出环的入口节点?
思路:显然是借鉴了上一题的套路,双指针就是答案。分析一下这个题目,首先,要确定有个环,再确定入口。再确定有没有环的同时还能得到环的大小的话,入口节点就好办了。
ListNode* MeetingNode(ListNode* pHead)
{
if(pHead=nullptr)
return nullptr;
ListNode* pSlow=pHead->m_pNext;
if(pSlow==nullptr)
return nullptr;
ListNode* pFast=pSlow->m_pNext;
while(pFast!=nullptr&&pSlow!=nullptr)
{
if(pFast=pSlow)
return
pFast;
pSlow=pSlow->m_pNext;
pFast=pFast_>m_pNext;
if(pFast!=nullptr)
pFast=pFast->m_pNext;
}
return nullptr;
}
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode* meetingNode=MeetingNode(pHead);
if(meetingNode==nullptr)
return nullptr;
int nodesInLoop=1;
ListNode* pNode1=meetingNode;
while(pNode1->m_pNext!=meetingNode)
{
pNode1=pNode1->m_pNext;
++nodesInLoop;
}
pNode1=pHead;
for(int i=0;i<nodesInLoop;++i)
pNode1=pNode1->m_pNext;
ListNode* pNode2=pHead;
while(pNode1!=pNode2)
{
pNode1=pNode1->m_pNext;
pNde2=pNode2->m_pNext;
}
return pNode1;
}
总结:来两个指针,一个快的,执行一次走两步,一个慢的,执行一次走一步,如果这个链表有环的话,那么在足够多次的循环后必然相撞。这个相撞的地点必然是环中一处,那么再来一轮循环,不过是从刚刚那个地方开始,计数,直到回到那点,这时能够得到环的大小。这个时候,再来两个指针,一先一后,先的那个先走环的大小,然后同步走,最终碰撞点就是入口点。这也是有指针才好操作的,所以上面的代码我理解后并没有检验过。
思路:显然是借鉴了上一题的套路,双指针就是答案。分析一下这个题目,首先,要确定有个环,再确定入口。再确定有没有环的同时还能得到环的大小的话,入口节点就好办了。
ListNode* MeetingNode(ListNode* pHead)
{
if(pHead=nullptr)
return nullptr;
ListNode* pSlow=pHead->m_pNext;
if(pSlow==nullptr)
return nullptr;
ListNode* pFast=pSlow->m_pNext;
while(pFast!=nullptr&&pSlow!=nullptr)
{
if(pFast=pSlow)
return
pFast;
pSlow=pSlow->m_pNext;
pFast=pFast_>m_pNext;
if(pFast!=nullptr)
pFast=pFast->m_pNext;
}
return nullptr;
}
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode* meetingNode=MeetingNode(pHead);
if(meetingNode==nullptr)
return nullptr;
int nodesInLoop=1;
ListNode* pNode1=meetingNode;
while(pNode1->m_pNext!=meetingNode)
{
pNode1=pNode1->m_pNext;
++nodesInLoop;
}
pNode1=pHead;
for(int i=0;i<nodesInLoop;++i)
pNode1=pNode1->m_pNext;
ListNode* pNode2=pHead;
while(pNode1!=pNode2)
{
pNode1=pNode1->m_pNext;
pNde2=pNode2->m_pNext;
}
return pNode1;
}
总结:来两个指针,一个快的,执行一次走两步,一个慢的,执行一次走一步,如果这个链表有环的话,那么在足够多次的循环后必然相撞。这个相撞的地点必然是环中一处,那么再来一轮循环,不过是从刚刚那个地方开始,计数,直到回到那点,这时能够得到环的大小。这个时候,再来两个指针,一先一后,先的那个先走环的大小,然后同步走,最终碰撞点就是入口点。这也是有指针才好操作的,所以上面的代码我理解后并没有检验过。
相关文章推荐
- 剑指offer面试题56 链表中环的入口节点(java实现)
- 剑指Offer 面试题23:链表中环的入口节点 Java代码实现
- 剑指offer--面试题23:链表中环的入口节点
- 《剑指Offer》面试题56:链表中环的入口节点
- 【剑指offer】面试题23:链表中环的入口节点
- 剑指Offer面试题56:链表中环的入口节点 Java实现
- 面试题(二十三) 链表中环的入口节点
- 面试题56:链表中环的入口节点
- 面试题56:链表中环的入口节点
- 剑指offer——面试题56:链表中环的入口
- 【剑指**】23.链表中环的入口节点
- python剑指offer 链表中环的入口节点
- 链表中环的入口节点
- 7.剑指offer-链表中环的入口节点
- 链表中环的入口节点
- 找出有环链表中环的入口节点
- 【剑指Offer】面试题56:链表中环的入口结点
- 【剑指Offer学习】【面试题56:链表中环的入口结点】
- 面试题56. 链表中环的入口结点
- 剑指Offer-23:链表中环的入口节点