[链表专题]相交链表

描述

本题是力扣的160. 相交链表

考点

  • 链表的相交

题解

class Solution {
	public:
		ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
			ListNode *curA = headA, *curB = headB;
			while (curA != curB) {
				curA = curA == nullptr ? headB : curA->next;
				curB = curB == nullptr ? headA : curB->next;
			}
			return curA;
		}
};

思路

链表的相交问题需要用到双指针

设链表A的节点为{a1, a2, c1, c2},链表B的节点为{b1, b2, b3, c1, c2};两个链表相交于节点c1,自节点c1起为相交公共部分

假设游标指针curA和curB同时出发,并最终相交于节点c1;观察路径轨迹,可以发现有以下恒等式:
a 1 + a 2 + c 1 + c 2 ⏟ c u r A 遍历链表 A + b 1 + b 2 + b 3 ⏟ c u r A 遍历 B 部分 + c 1 = b 1 + b 2 + b 3 + c 1 + c 2 ⏟ c u r B 遍历链表 B + a 1 + a 2 ⏟ c u r B 遍历 A 部分 + c 1 \underset{curA\text{遍历链表}A}{\underbrace{a1+a2+c1+c2}}+\underset{curA\text{遍历}B\text{部分}}{\underbrace{b1+b2+b3}}+c1=\underset{curB\text{遍历链表}B}{\underbrace{b1+b2+b3+c1+c2}}+\underset{curB\text{遍历}A\text{部分}}{\underbrace{a1+a2}}+c1 curA遍历链表A a1+a2+c1+c2+curA遍历B部分 b1+b2+b3+c1=curB遍历链表B b1+b2+b3+c1+c2+curB遍历A部分 a1+a2+c1
故而,若A、B两个链表存在交点,应做如下操作:

  • curA遍历A链表,然后再从B链表头节点继续遍历

  • curB遍历B链表,然后再从A链表头节点继续遍历

  • curA和curB的遍历同步进行;最终会相遇在相交节点

假如不相交呢?最终curA和curB两个指针值也是相等的,均为nullptr

因为curA先遍历了A链表再遍历了B链表,curB先遍历了B链表再遍历了A链表,两个指针又是同时遍历,自然最终结果一样

更多

恭喜你完成本题!

你可以选择继续下一题,或移步至仓库开始更多类型的挑战:https://fi3wey.github.io/

仓库内包含了更多经典案例的逻辑剖析与实现细节,助你在算法的学习之旅上一往无前!

看官若还满意,还请Star一下哟~

关注公众号峰狂算法,获取最新的刷题指导呀~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值