这道题 要想解决其实不难, 开两层循环进行遍历就能实现,但是会超时

如果想要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实现的更多相关文章

  1. LeetCode 相交链表&环形链表II

    题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/ 题目连接:https://leetcode-cn.com ...

  2. leetcode 奇偶链表 python

    要求空间复杂度O(1) 那就只能用指针不断改链表的指针, 不能建立新的内存 时间复杂度O(1) 一遍遍历 不能嵌套循环 我的思想是: 1 如果链表元素数量小于等于2个,那就无法操作 2 能操作的情况下 ...

  3. LeetCode 相交链表

    基本思路 先计算出两个链表的长度 O(n) 将长的一个链表的指示指针移动到和短链表相同长度 O(n) 两个链表指示指针同时向前移动,直到二者相同或者NULL 代码实现 /** * Definition ...

  4. 【LeetCode题解】160_相交链表

    目录 160_相交链表 描述 解法一:哈希表 思路 Java 实现 Python 实现 解法二:双指针(推荐) 思路 Java 实现 Python 实现 160_相交链表 描述 编写一个程序,找到两个 ...

  5. LeetCode 160: 相交链表 Intersection of Two Linked Lists

    爱写Bug(ID:iCodeBugs) 编写一个程序,找到两个单链表相交的起始节点. Write a program to find the node at which the intersectio ...

  6. LeetCode 160——相交链表(JAVA)

    编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB ...

  7. leetcode腾讯精选练习之相交链表(六)

    相交链表 题目: 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5 ...

  8. Java实现 LeetCode 160 相交链表

    160. 相交链表 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4, ...

  9. Leetcode解题-链表(2.2.0)基础类

    1 基类的作用 在开始练习LeetCode链表部分的习题之前,首先创建好一个Solution基类,其作用就是: Ø  规定好每个子Solution都要实现纯虚函数test做测试: Ø  提供了List ...

随机推荐

  1. 在mac环境下用QT使用OpenGL,glut,glfw

    只需要在新建工程中.pro文件中添加: #opengl glut LIBS+= -framework opengl -framework glut 就可以使用glut了. 继续添加: ##glfw L ...

  2. Understanding the Space Used by ZFS -- (转)

    Understanding the Space Used by ZFS By Brian Leonard on Sep 28, 2010 Until recently, I've been confu ...

  3. Python的类变量和成员变量、类静态方法和类成员方法

    先说明几个相关的术语:attribute.function.method. attribute:类对象的数据成员.我们经常会在Python代码出错时遇到:“AttributeError: 'My_Cl ...

  4. 2016.07.13-map的使用(以leetcode1-Two Sum为例)

    map的使用 1.unordered_map和map的区别 2.如何用 3.for (int a : nums1) 4.to_string() 5.map的应用 1.unordered_map和map ...

  5. 2016.6.17——Remove Duplicates from Sorted Array

    Remove Duplicates from Sorted Array 本题收获: 1.“删除”数组中元素 2.数组输出 题目: Given a sorted array, remove the du ...

  6. LINUX的DNS设置【转】

    网卡DNS设置 用windos系统大家都知道,本地连接里面有一个DNS设置. 那么这个选项对应Linux系统的话就是在网卡配置文件,通过编辑vi  /etc/sysconfig/network-scr ...

  7. Nagios Openstack Plugin

    Some simple example for checking Openstack services check nova service list #!/bin/sh export OS_PROJ ...

  8. Pytorch数据读取框架

    训练一个模型需要有一个数据库,一个网络,一个优化函数.数据读取是训练的第一步,以下是pytorch数据输入框架. 1)实例化一个数据库 假设我们已经定义了一个FaceLandmarksDataset数 ...

  9. Shell编程学习1--基础了解

    "#!path"告诉系统path所指的程序为用来解释此脚本文件的Shell程序: 如#!/bin/sh, #!/bin/bash Shell Script的后缀名为.sh; ech ...

  10. 浅谈C#中的模式窗体和非模式窗体

    ShowDialog(); // 模式窗体 Show(); // 非模式窗体 区别: 返回值不同,DialogResult/void 模式窗体会使程序中断,直到关闭模式窗口 打开模式窗体后不能切换到应 ...