题目:
如何判断一个单链表是否有环?有环的话返回进入环的第一个节点的值,无环的话返回-1。如果链表的长度为N,请做到时间复杂度O(N),额外空间复杂度O(1)。
给定一个单链表的头结点head(注意另一个参数adjust为加密后的数据调整参数,方便数据设置,与本题求解无关),请返回所求值。
思路:
判断有环无环:使用快慢指针fast和slow。fast一次走两步,slow一次走一步。如果最终它们能相遇,则说明链表中一定有环;如果fast遍历到了空结点,则说明无环。
返回入环结点:
如上图所示,当slow和fast相遇后,链表头部到环入口的长度等于slow指针走c步到达入口然后再走n-1个循环,设置一个指针从头结点重新开始遍历,而slow(或fast)继续向后移动,当这两个指针相遇时,就是环入口的结点
代码:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class ChkLoop:
def chkLoop(self, head, adjust):
# write code here
if not head:
return -1
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if fast == slow:
break
if not fast or not fast.next:
return -1
slow = head
while slow != fast:
slow = slow.next
fast = fast.next
return slow.val