(python版) Leetcode-160.相交链表

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 = None

class 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值