题目
描述
给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
数据范围:
1<=结点值<=10000
要求:空间复杂度 O(1),时间复杂度 O(n)
输入描述:
输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台会根据第二段是否为空将这两段组装成一个无环或者有环单链表
返回值描述:
返回链表的环的入口结点即可,我们后台程序会打印这个结点对应的结点值;若没有,则返回对应编程语言的空结点即可。
思路
先判断有没有环,一个节点走快点,一个节点走慢点,如果能够相遇一次则证明有环,所以一定能够相遇第二次,第一次相遇时,快的节点回到哨岗节点重新开始走,这时候快的节点和慢的节点应该走的一样快,当他们第二次相遇的时候的节点就是入口节点。
代码
python版本:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
# write code here
sg = ListNode(-1)
sg.next = pHead
slow = sg.next
fast = sg.next.next
num = 0
res = None
while(slow!=None and slow.next!=None and fast!=None and fast.next!=None):
if(slow==fast):
num+=1
if(num==1):
fast = sg
if(num==2):
res = slow
break
slow = slow.next
if(num==1):
fast = fast.next
elif(num==0):
fast = fast.next.next
return res
c++版本:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
ListNode *sg = new ListNode(-1);
sg->next = pHead;
ListNode *slow = sg->next;
ListNode *fast = sg->next->next;
ListNode *res = nullptr;
int num = 0;
while(slow && slow->next && fast && fast->next){
if(slow==fast){
num++;
if(num==1){
fast = sg;
}
if(num==2){
res = slow;
break;
}
}
slow = slow->next;
if(num==1){
fast = fast->next;
}else{
fast = fast->next->next;
}
}
return res;
}
};