博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(python版) Leetcode-160.相交链表
阅读量:4091 次
发布时间:2019-05-25

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

01 题目

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

编写一个程序,找到两个单链表相交的起始节点。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

02 解析

第一次看到这题目就想了挺久,困惑在两个地方:

1.示例1的相交节点为什么不是1
2.为什么大部分解题思路中都说要走a+c+b,和b+c+a

直到看到下面这个非常直观的动图 和 题解思路~

【这道题其实跟 141.环形链表 有点类似,环形链表中题目已经明确说链表是有环的。而这道题只是说了两个链表有相交的节点,那么我们可以改变一下链表的结构,人为的将这个链表变成环形

我们可以将a和b两个链表强行串联起来,变成一个8字的形状。
原结构如下:将b链表的尾巴指向a节点的头部,将a节点的尾巴指向b链表的头部
在这里插入图片描述
然后我们定义两个指针,一个从a链表头出发,一个从b链表头出发,因为是环形的,最终两个链表会相遇,而相遇的节点就是相交的节点
在这里插入图片描述

03 代码

# Definition for singly-linked list.# class ListNode(object):#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution(object):	def getIntersectionNode(self, headA, headB):		"""		:type head1, head1: ListNode		:rtype: ListNode		"""		a,b = headA,headB		# 定义了两个节点a和b,只要a和b不等就继续遍历		while a!=b: # 这步很关键,请对照动态图配合理解,			#当a的下一个为空时,就a就从b链表头开始遍历			a = a.next if a else headB			# 同理,b也是类似的			b = b.next if b else headA		return a

作者:wang_ni_ma

链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/solution/dong-hua-yan-shi-160-xiang-jiao-lian-biao-by-user7/

转载地址:http://vujii.baihongyu.com/

你可能感兴趣的文章
【UGUI/NGUI】一键换Text/Label字体
查看>>
【C#】身份证本地验证
查看>>
【Unity】坑爹的Bug
查看>>
【算法】求数组中某两个数的和为目标值
查看>>
如何高效学习动态规划?
查看>>
动态规划法(六)鸡蛋掉落问题(一)
查看>>
LeetCode 887.鸡蛋掉落(C++)
查看>>
Dijkstra‘s algorithm (C++)
查看>>
奇异值分解(SVD)的原理详解及推导
查看>>
算法数据结构 思维导图学习系列(1)- 数据结构 8种数据结构 数组(Array)链表(Linked List)队列(Queue)栈(Stack)树(Tree)散列表(Hash)堆(Heap)图
查看>>
求LCA最近公共祖先的离线Tarjan算法_C++
查看>>
Leetcode 834. 树中距离之和 C++
查看>>
【机器学习】机器学习系统SysML 阅读表
查看>>
最小费用最大流 修改的dijkstra + Ford-Fulksonff算法
查看>>
最小费用流 Bellman-Ford与Dijkstra 模板
查看>>
实现高性能纠删码引擎 | 纠删码技术详解(下)
查看>>
scala(1)----windows环境下安装scala以及idea开发环境下配置scala
查看>>
zookeeper(3)---zookeeper API的简单使用(增删改查操作)
查看>>
zookeeper(4)---监听器Watcher
查看>>
zookeeper(2)---shell操作
查看>>