相交链表
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
。
图示两个链表在节点 c1
开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
自定义评测:
评测系统 的输入如下(你设计的程序 不适用 此输入):
intersectVal
- 相交的起始节点的值。如果不存在相交节点,这一值为0
listA
- 第一个链表listB
- 第二个链表skipA
- 在listA
中(从头节点开始)跳到交叉节点的节点数skipB
- 在listB
中(从头节点开始)跳到交叉节点的节点数
评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA
和 headB
传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。
这道题是简单题应该是因为时间复杂卡的不严,因为最能让人想到的就是两个for然后循环暴力出来,巧妙的是问题转化。其实这个问题转换成了两条路径长度不同,如何找到交点,a与b走两条不同长度的路,假设每次走一步,还想以o(n)的复杂度知道交点在哪?
更多需要注意的是两条路是固定且未知的,既然存在不平等,那么a和b就走完两条路的总路程,就会相遇了!这也是这道题目的巧妙之处,很遗憾没想到 (⊙﹏⊙)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:
# nba
a = headA
b = headB
# 两条路不一样长,最后能够相交的方法就是大家换着走一遍就知道了
while a!=b:
a = a.next if a!=None else headB
b = b.next if b!=None else headA
if a == None:return None
else:return a