leetcode 相交链表 python实现

这道题 要想解决其实不难, 开两层循环进行遍历就能实现,但是会超时
如果想要O(n) 的时间复杂度, 我考虑用哈希表来存储遍历过的元素,如果发现当前遍历的元素在哈希表里,那说明交叉点就在这
这里利用了哈希表的查找时间是O(1)
但是这种算法不能满足空间复杂度是O(1)的要求
代码像这样:
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
# 如果有一个链表是空的 那就没有交叉
if headA is None or headB is None:
return None
# 计算一下两个链表的长度
ca = headA
cb = headB
ta, tb = 1, 1
while ca.next is not None:
ta += 1
ca = ca.next
while cb.next is not None:
tb += 1
cb = cb.next
# 如果最后一个元素都不一样说明没有交叉
if ca.val != cb.val:
return None
# 如果两个链表长度不一样,将长得链表指针后移
ca = headA
cb = headB
while tb > ta:
tb -= 1
cb = cb.next
while ta > tb:
ta -= 1
ca = ca.next
# 从倒数长度相同的 短的链表的开头开始一位一位比较
while ca is not None and cb is not None:
if ca.val == cb.val:
return ca
ca = ca.next
cb = cb.next
经过一段时间思考,如果要满足空间复杂度是O(1) 那就不能开辟新空间,智能用指针来回移动的办法
1 如果任何一个链表是空的说明没有交叉
2 如果链表交叉了最后一个元素肯定相同, 如果不相同说明没交叉
3 如果确定了有交叉,计算一下两个链表的长度,
思想是 调整到一样长,然后按位比较 这样一次遍历就可以
具体这样做: 每个链表都有一个遍历指针,
短的链表的指针在头部
长的链表指针后移若干位,一直到 两个链表从尾巴开始数 到遍历指针的长度是相同的
接下来就一遍遍历 每一位都比较一下是否相等就可以
这样没有开辟新的空间 时间上是一遍遍历O(n)
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
# 建立一个哈希表,把每个第一次遍历到的元素存进去
# 如果发现之前存过当前元素说明交叉了
dic = {}
ca = headA
cb = headB
while ca is not None or cb is not None:
if ca is not None:
try:
dic[ca.val]
return ca
except:
dic[ca.val] = True
ca = ca.next
if cb is not None:
try:
dic[cb.val]
return cb
except:
dic[cb.val] = True
cb = cb.next
return None
leetcode 相交链表 python实现的更多相关文章
- LeetCode 相交链表&环形链表II
题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/ 题目连接:https://leetcode-cn.com ...
- leetcode 奇偶链表 python
要求空间复杂度O(1) 那就只能用指针不断改链表的指针, 不能建立新的内存 时间复杂度O(1) 一遍遍历 不能嵌套循环 我的思想是: 1 如果链表元素数量小于等于2个,那就无法操作 2 能操作的情况下 ...
- LeetCode 相交链表
基本思路 先计算出两个链表的长度 O(n) 将长的一个链表的指示指针移动到和短链表相同长度 O(n) 两个链表指示指针同时向前移动,直到二者相同或者NULL 代码实现 /** * Definition ...
- 【LeetCode题解】160_相交链表
目录 160_相交链表 描述 解法一:哈希表 思路 Java 实现 Python 实现 解法二:双指针(推荐) 思路 Java 实现 Python 实现 160_相交链表 描述 编写一个程序,找到两个 ...
- LeetCode 160: 相交链表 Intersection of Two Linked Lists
爱写Bug(ID:iCodeBugs) 编写一个程序,找到两个单链表相交的起始节点. Write a program to find the node at which the intersectio ...
- LeetCode 160——相交链表(JAVA)
编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB ...
- leetcode腾讯精选练习之相交链表(六)
相交链表 题目: 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5 ...
- Java实现 LeetCode 160 相交链表
160. 相交链表 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4, ...
- Leetcode解题-链表(2.2.0)基础类
1 基类的作用 在开始练习LeetCode链表部分的习题之前,首先创建好一个Solution基类,其作用就是: Ø 规定好每个子Solution都要实现纯虚函数test做测试: Ø 提供了List ...
随机推荐
- Python练习-从小就背不下来的99乘法表
心血来潮,灵机一动,反正就是无聊的做了一个很简单的小玩意: for i in range(1,10):#让i 1-9 循环9次 print("\n")#每循环一次进行一次换行 fo ...
- 解决Maven并行编译中出现打包错误问题的思路
解决Maven并行编译中出现打包错误问题的思路 并行构建 Maven 3.x 提供了并行编译的能力,通过执行下列命令就可以利用构建服务器的多线程/多核性能提升构建速度: mvn -T 4 clean ...
- 深入理解KS
一.概述 KS(Kolmogorov-Smirnov)评价指标,通过衡量好坏样本累计分布之间的差值,来评估模型的风险区分能力. KS.AUC.PR曲线对比: 1)ks和AUC一样,都是利用TPR.FP ...
- 使用idea的的第一个坑-----javax.xml.ws.WebServiceRef
新建项目启动报错的时候,一直报这个错,类找不到,郁闷了半天,都没百度到结果,后来发现是添加tomcat的时候jre没 指定..... 哈哈哈,太懵逼了,指定就ok了
- SQLServer 学习相关资料整理【转】
存储过程: SQL Server 存储过程 博客园上的一篇文章,讲解的非常详细,有测试代码,很实用. sqlserver存储过程中执行动态sql语句 The Curse and Blessings ...
- Team Foundation Server 2010服务器安装
本安装指南使用Windows Server 2008企业版为基础,安装Windows Server 2008 SP2(必须),在此操作系统环境上进行TFS2010的安装与配置. 三.系统用户设置 1. ...
- MongoDB安全:创建角色(User-Defined Roles)
MongoDB已经定义了一些内建角色,同时还提供了用户自定义角色的功能,以满足用户千差万别的需求. 官文User-Defined Roles中对其有简略介绍,但要熟悉怎么创建角色,还需要了解下面的这些 ...
- 数据库-mysql数据操作
一:mysql 数据的插入 语法 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法: INSERT INTO table_name ( field1, field2,...f ...
- shell中的特殊符号总结
在shell中常用的特殊符号罗列如下: # ; ;; . , / \\ 'string'| ! $ ${} $? $$ $* \"string\"* ** ...
- Luogu P1750 【出栈序列】
一眼(万年)贪心minn设小调不出来祭 首先要保证更靠前的输出更小那么容易想到,对于之后可能入栈的元素(即栈的剩余空间仍能装下的所有元素),我们可以取其中的最小值minn,和栈顶元素$top$比较,如 ...