题目在这:​​https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/​

题目分析:

隐隐约约感觉做过这道题了。。。

读完题我就想把链表转换成列表然后对比找到第一个相交节点,后来发现不行。。。。

一定要注意这道题所说的相交节点,是指指针指向同一位置,即指针所指地址相同,而非指针所指的值相同

思路分析:

当两个链表长度不一样的时候,较长的链表长出来的部分一定没有相交节点存在,所以先把长的一部分去掉,然后同时移动两个指针即可找到有没有相交的节点了。

法一:

完整代码

def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
s1, s2 = 0, 0
p, q = headA, headB
while p: # 计算headA的长度
p = p.next
s1 +=1
while q: # 计算headB的长度
q = q.next
s2 += 1
p, q = headA, headB
temp = abs(s1 - s2)
if s1 > s2: # A长。A先走
for i in range(temp):
p = p.next
if s2 > s1:# B长,B先走
for i in range(temp):
q = q.next
while p and q: # 等长时,一起走
if p == q:
return p
p = p.next
q = q.next

上述代码中的:

= abs(s1 - s2)
if s1 > s2: # A长。A先走
for i in range(temp):
p = p.next
if s2 > s1:# B长,B先走
for i in range(temp):
q = q.next

可以简化替换成:

for i in range(s1 -s2):
p = p.next
for i in range(s1-s2):
q = q.next

range里如果是单个的负数,比如​​range(-3)​​。这种情况是不会进入for循环的。

法二(走过彼此的路):

我想起来了。这道题是leetcode主站的一道题,俩题一样。大家可以参考我之前的文章解法。