题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
分析
假设环长为k,则找入口结点,就是找倒数第k个结点,这样想则此题就转换为找链表的倒数第k个结点。只要能确定环的长度,问题即解。
先用快慢指针确定有没有环,然后在确定环的长度k,最后,两个指针一个指向头,一个先向前走k步,然后两个指针同步走,知道相遇就是环入口点。
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
if not pHead:
return None
loop = self.has_loop(pHead)
if not loop:
return None
ll = loop.next
cnt = 0
while ll != loop:
cnt += 1
ll = ll.next
# print('cnt=',cnt)
p, q = pHead, pHead
while cnt>=0:
cnt -= 1
q = q.next
while p and q and p != q:
p = p.next
q = q.next
return p
def has_loop(self, pHead):
p = pHead
q = p.next.next
found = None
while p and q and not found:
if p == q:
found = p
p = p.next
q = q.next.next
return found
t1 = ListNode(1)
t2 = ListNode(2)
t3 = ListNode(3)
t4 = ListNode(4)
t5 = ListNode(5)
t6 = ListNode(6)
root = t1
t1.next = t2
t2.next = t3
t3.next = t4
t4.next = t5
t5.next = t6
t6.next = t4
s = Solution().EntryNodeOfLoop(root)
print(s.val)#4