《剑指Offer》刷题之链表中环的入口结点
我不知道将去向何方,但我已在路上! |
---|
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! |
- 题目:
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 - 代码1:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
p1 = p2 = pHead
while p1 and p2.next:
p1 = p1.next
p2 = p2.next.next
if p1 == p2:
temp = pHead
while p1 != temp:
p1 = p1.next
temp = temp.next
return p1
return None
- 算法说明:
- 建立快慢指针
p1, p2
; - 两个指针同时从链表的头部出发,
p1
每次走1步,p2
每次走2步; - 如果链表有环,两个指针必然在环内相遇(和博尔特在操场跑圈,总会被套圈的);
- 把其中的一个指针重新指向链表头部,另一个在环内不变;
- 现在,两个指针每次走1步,在入口处相遇,返回即可。