【实战】ACM 选手图解 LeetCode 相交链表

大家好呀,我是直男蛋。

今天来做相交链表,这道题本来是难度简单的水题,但是有两个奇怪点把我给整楞了。

一个就是题意,另一个就是解题方式,感觉直接把我的直男属性给暴露了。

具体的到下面细聊,现在先开始看题。

ebfe8f04df82891c77f29b869f7f753

LeetCode 160:相交链表

题意

给出两个单链表的头节点,找出两个单链表相交的起始节点。

示例

e1558939fd5da6eaf1dcc83a84aa50a

提示

题目保证不存在环。

  • len(listA) = m, len(listB) = n

  • 0 <= m, n <= 3 * 10^4

  • 1 <= Node.val <= 10^5

  • 0 <= skipA <= m, 0 <= skipB <= n

题目解析

在说我的解法之前,我先来说一下文章开头我说的是啥意思。

这个题目一开始题意给我看楞了,不看示例,打眼看上去还以为是找数值相等的节点。

估计很多臭宝容易看懵,这道题其实是找相交节点的指针(即同一节点,引用完全相同),而不是单纯遍历找第一个数值相同的节点,这点大家要搞清楚。

光这个出题的题意,我感觉就得值个难度 hard!

bf8421e47e72f8a3724ad76bdb37134

其实搞清楚了题意,稍微一想解法就能出来。

在我劈里啪啦的敲完代码然后 AC 的时候,随意点开了力扣的题解区,官方的题解给我看楞了。

虽然用了双指针,但是它的解法楞是用上了数学的思想。怕你们在做的时候会先去看题解,然后又看不懂别人怎么个思想,所以这里就给臭宝们讲一下**“浪漫”的做法**。

1266ec8549c864358f70b0c8ab7c9f1

官方的方法是:

  • 链表 A 的指针 flagA 从链表 A 的头节点开始遍历完链表 A,再遍历链表 B
  • 链表 B 的指针 flagB 从链表 B 的头节点开始遍历完链表 B,再遍历链表 A

这样的话就消除了链表 A 和 B 的长度差。

假设链表 A 长度为 a,链表 B 长度为 b,两个链表相交的部分长度为 c。

当走到相交节点时:

  • flagA 走过的长度为:a + (b - c)
  • flagB 走过的长度为:b + (a - c)

这种做法,不管两个指针是否相交,他们走过的长度都是一样的,所以就有了公式:
a + ( b − c ) = b + ( a − c

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值