代码随想录_链表_链表相交

前置条件

给定两个单链表,找出他们相交部分的首个节点

  • 求长度+双指针法
len_a,len_b = 0,0
cur = headA
while cur: # 求A的长度
	cur = cur.next
	len_a += 1
cur = headB
while cur: # 求B的长度
	cur = cur.next
	len_b += 1
cur_a,cur_b = headA,headB
if len_A > len_b: # 使B是更长的链表
	cur_a,cur_b = cur_b,cur_a
	len_a,len_b = len_b,len_a
for i in range(len_b - len_a): # 让B和A保持相同长度
	cur_b = cur_b.next
while cur_a: # 向后遍历,返回第一个相交的节点
	if cur_a == cur_b:
		return cur_a
	else:
		cur_a = cur_a.next
		cur_b = cur_b.next
return None
  • 比例法
    假设A链表的长度为m,B链表的长度为n,如果两个链表有相交的部分且相交部分长度为c
    情况一:m==n
    直接从两个链表头遍历,找到第一个相等的节点即可
    情况二:m!=n
    m = a + c
    n = b + c
    可以看出找到相交节点的最少的遍历次数是a+b+c,具体来说,对于链表A遍历完自身的a+c个节点后跳到链表B的头节点再遍历b个节点;对于链表B遍历完自身b+c个节点后跳到链表A的头节点再遍历a个节点
if not headA or not headB:
	return None
cur_a,cur_b = headA,headB
while cur_a != cur_b: # 遍历a+b+c 
	cur_a = cur_a.next if cur_a else headB
	cur_b = cur_b.next if cur_b else headA
return cur_a # 找到首个节点或者None
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值