有环单链表,求环长、链长;求两链表的交点

本文探讨了如何解决有环单链表的问题,包括判断链表是否存在环、求环长和链长。介绍了快慢指针的方法,以及如何找到两链表的交点。同时提供了两种解决两链表交点问题的策略:转换为有环链表求解和通过比较链表长度同步指针行走。
摘要由CSDN通过智能技术生成

有环单链表,求环长、链长

这是一个关于单链表的经典例题。即,给定一个有环的单链表,求环长、链长等。或者,给定一个单链表,判断是否有环?

可以遍历这个链表,将每一个节点存入一个有顺序的集合,同时判断当前节点是否在这个集合中出现,从而判断该链表是否有环以及求环长与链长。当时空间复杂度与时间复杂度都过大了。

另一个经典方法就是快慢指针,即两个指针同时从链表头开始走,快指针一次走2步,慢指针一次走1步。于是
有环单链表的经典解法
假设这个有环链表的join点之前的节点数为a,环长为n,两个指针相遇点距离表头距离为a+b。如上图,其中k表示快慢指针相遇的时候,快指针走过环的圈数。

那么,让快慢指针同时从表头出发,当它们相遇的时候,让慢指针回到表头,并让快指针的步长变为1。等到它们再次相遇的时候,相遇点即为链表环的join点。

原因如上图,快指针再走a个节点(此时每步走一个节点)就会到达join点,慢指针从表头开始走a个节点也会到达join点。

这样即可判断给定单链表是否有环。也能求解环长以及链长。

代码如下:

class Node:
    def __init__(self, val):
        self.val = val
        self.next = None

def buildRingedLinkList
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值