剑指offer-python:21.链表中环的入口节点&22.反转链表

题目:一个链表中包含环,请找出该链表的环的入口结点。

输入为链表头,即下图的1。

如图,找到入环点3。

 解析:参考力扣(力扣

jindian_02.08.png

分析第一次相遇,设快指针走了m圈环,慢指针走了n圈环

那么
快指针走了:a + (b+c)m + b
慢指针走了:a + (b+c)n + b
根据快走的是慢的两倍,a + (b+c)m + b = 2(a + (b+c)n + b)
化简为:a = (b+c)(m-2n) - b
就是说,a的距离等于(环长度的倍数 - b),或者说,a = 环长度倍数 + c
那么P1走了a,刚好能遇到走了(环长度的倍数 - b,或者说是“环长度倍数 + c”)的P2。

也就是说,当慢指针走了长度为a时,快指针走过了c,并又绕环几圈,回到了入环点。

一般情况下,在第一次相遇前,快指针每次走的步>=2,第二次,快指针每次走步数为1。

代码:

def detectCycle(self, head):        
    fast = slow = head
    # 检测是否有环
    while fast and fast.next:
        slow, fast = slow.next, fast.next.next
        if slow is fast:
            break
    else:
        return None
    # 找出入口节点
    while head is not slow:
        head, slow = head.next, slow.next
    return head

---------------------------------------------------------------------------------------

反转链表:

代码:

def reverseList(head):
    prev = None
    while head:
        head.next, prev, head = prev, head, head.next
    return prev

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值