剑指 Offer 52. 两个链表的第一个公共节点 (计算长度法) (走过彼此的路法)
推荐
原创
©著作权归作者所有:来自51CTO博客作者深度不学习的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目在这: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主站的一道题,俩题一样。大家可以参考我之前的文章解法。