链表中环的问题

1. 链表中是否有环

leetcode141

思路:设置快慢指针,fast和low,两者都从链表头出发,快指针每次走两步,慢指针每次走一步,若存在环,则快慢指针会在某个链表节点相遇

if not head or not head.next:
	return False
// 定义快慢指针初始位置不一样,是因为循环条件先于循环体
// 如定义一样的初始位置,则需要使用do while循环
slow = head
fast = head.next
while slow!=fast:
// 当链表中不存在环时,快指针先到达链表尾部
	if not fast or not fast.next:
		return False
	slow =slow.next
	fast = fast.next.next
return True


class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        fast = head
        slow = head
        while fast and fast.next:
            slow =head.next;
            fast = fast.next.next
            if slow ==fast:
                return True
        return False
时间复杂度:O(N)
空间复杂度:O(1)

解法2:hash表

遍历所有的节点,每次遍历一个节点的时候,判断此节点是否存在于hash表中,如果存在则表示存在环,如果不存在则将该节点加入hash表中

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        seen = set()
        while head:
            if head in seen:
                return True
            seen.add(head)
            head = head.next
        return False

时间复杂度:O(N)
空间复杂度:O(N)

2. 链表中环的入口节点

给定一个链表,若其中包含环,请找出该链表的环的入口节点,否则,输出null

leetcode142

解题思路:

  1. 设置快慢指针,fast和low,两者都从链表头出发,快指针每次走两步,慢指针每次走一步,若存在环,则快慢指针会在某个链表节点相遇
  2. 两指针分别从链表头和相遇点出发,则他们的相遇点就是环的入口处在这里插入图片描述
// 如果没有环,返回null
if not fast.next  or not fast.next.next:
	return null
// 如果有环,fast指针不变,还是在相遇点
slow = head //slow在链表头
while slow!=fast:
	slow =slow.next
	fast = fast.next
return fast

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值