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/