【55】链表中环的入口结点
- 时间限制:1秒
- 空间限制:32768K
- 本题知识点: 链表
题目描述
一个链表中包含环,请找出该链表的环的入口结点。
牛客网题目链接:点击这里
代码:
// Source: http://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=13&tqId=11208&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
// Author: Yang Qiang
// Date : 2016-8-12
#include<iostream>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
//空链情况
if(pHead==NULL) return NULL;
//定义两个结点指针
ListNode* p1=pHead;
ListNode* p2=pHead;
while(p1 && p2)
{
p1=p1->next; //p1走1步
p2=p2->next; //p2走2步
if(p2) p2=p2->next;
else return NULL; //为空说明无欢
if(p1==p2 && p1)
{
p2=pHead;
break;
}
}
while(p1 && p2)
{
if(p1==p2 && p1)
{
return p1;
}
p1=p1->next;
p2=p2->next;
}
return NULL;
}
};
方法二:
///方法二:剪断环
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
//空链情况
if(pHead==NULL) return NULL;
//定义两个结点指针
ListNode* p1=pHead;
ListNode* p2=pHead;
while(p2->next) //直到p2为空
{
p2=p2->next;
p1->next=NULL;
p1=p2;
}
return p2;
//return NULL;
}
};
思路:
1.边走边断后路法,这样会破坏链表
2.(p1,p2)一步两步追赶法。追上说明有环,
//然后再将p2拉回起点,均单步走,相遇点即为入口结点。
通过图片