博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(python版)《剑指Offer》JZ55:链表中环的入口结点
阅读量:4090 次
发布时间:2019-05-25

本文共 1634 字,大约阅读时间需要 5 分钟。

本系列文章为《剑指Offer》刷题笔记。

刷题平台:

在这里插入图片描述

快慢指针

基于以下两个结论:

(1) 设置快慢指针,假如有环,他们最后一定相遇。

(2) 两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。

证明结论1:设置快慢指针fast和low,fast每次走两步,low每次走一步。假如有环,两者一定会相遇(因为low一旦进环,可看作fast在后面追赶low的过程,每次两者都接近一步,最后一定能追上)。

证明结论2

设:
  链表头到环入口长度为 - - a
  环入口到相遇点长度为 - - b
  相遇点到环入口长度为 - - c

如下图所示:

在这里插入图片描述

则:相遇时

  快指针路程=a+(b+c)k+b ,k>=1 其中b+c为环的长度,k为绕环的圈数(k>=1,即最少一圈,不能是0圈,不然和慢指针走的一样长,矛盾)。
  慢指针路程 = a+b
  快指针走的路程是慢指针的两倍,所以:(a+b) * 2=a+(b+c)k+b

化简可得:

  a=(k-1)(b+c)+c
  这个式子的意思是: 链表头到环入口的距离=相遇点到环入口的距离+(k-1)圈环长度。
  其中k>=1,所以k-1>=0圈。

所以两个指针分别从链表头和相遇点出发,最后一定相遇于环入口

时间复杂度为O(n),空间复杂度为O(1)

# -*- coding:utf-8 -*-# class ListNode:#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution:    def EntryNodeOfLoop(self, pHead):        # write code here        if not pHead:            return None        pFast,pSlow = pHead,pHead        while pFast:        	# pFast走的快,它先去探还有没有路            if pFast.next:                pFast = pFast.next.next            else:                return None                        pSlow = pSlow.next            if pFast == pSlow:    # 此时pSlow停在遇见点                break                        newHead = pHead        while newHead != pSlow:    # pslow和newHead分别从遇见点和pHead出发,一步一步走,必然能够找到入口            newHead = newHead.next            pSlow = pSlow.next        return pSlow

https://blog.csdn.net/CSDN_SUSAN/article/details/103041082?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai

https://blog.csdn.net/qq_36643449/article/details/106240794

你可能感兴趣的文章
DirectX11 点光
查看>>
DirectX11 聚光灯
查看>>
DirectX11 HLSL打包(packing)格式和“pad”变量的必要性
查看>>
DirectX11 光照演示示例Demo
查看>>
漫谈一下前端的可视化技术
查看>>
VUe+webpack构建单页router应用(一)
查看>>
Vue+webpack构建单页router应用(二)
查看>>
从头开始讲Node.js——异步与事件驱动
查看>>
Node.js-模块和包
查看>>
Node.js核心模块
查看>>
express的应用
查看>>
NodeJS开发指南——mongoDB、Session
查看>>
Express: Can’t set headers after they are sent.
查看>>
2017年,这一次我们不聊技术
查看>>
实现接口创建线程
查看>>
Java对象序列化与反序列化(1)
查看>>
HTML5的表单验证实例
查看>>
JavaScript入门笔记:全选功能的实现
查看>>
程序设计方法概述:从面相对象到面向功能到面向对象
查看>>
数据库事务
查看>>