代码随想录算法训练|面试题 02.07. 链表相交

 一、题目描述:

代码随想录链接

代码随想录

LeetCode题目链接

 面试题 02.07. 链表相交 - 力扣(LeetCode)

明确“链表相交”的含义:

两个链表指针指向的同一结点,而不是存储数值相同的两个结点

因此判断条件不是值相同,而是指针相同。

二、涉及的基本知识:

2.3.1_单链表的定义_哔哩哔哩_bilibili

链表知识的综合运用,前边均已提及,此处不再细说

三、解题思路:

因为两个链表的长度可能不同,故不能直接同步遍历寻找;

因为翻转链表被ban掉,先翻转同步遍历,再翻转回去

因为虚拟头结点被ban掉,循环嵌套(外层遍历A,内层遍历B)无法处理子链表等特殊情况;

最优解是随想录给的尾部对齐,再从相同位置同步遍历查找,非常巧妙。

特殊情况:

1.不相交

2.子链表(如{2,3}和{1,2,3})

3.空链表

四、代码

第一次尝试,翻转链表同步遍历;

既错会了链表相交的意思,又改变了链表结构,取巧失败:

第二次尝试,循环嵌套;

嵌套了三层循环,虽然这个时候还是没能正确理解“链表相交”,在按值相等来寻找,但是把一个对我来说比较复杂的嵌套循环想法变成代码实现出来,还是很有成就感的

(好不容易写出来,发现case1运行不通过的时候真的破大防,好好审题的重要性)

第三次尝试,循环嵌套;

这时候终于理解题目目的了,指针相同比值相同更好处理,两层循环可解决大部分问题;

但是由于不能使用虚拟头结点,导致子链表这一特殊情况处理起来非常复杂,代码泛用性较差,目前还没解决这个问题:

第四次尝试,对齐后同步遍历;

非常巧妙的思路,比循环暴力破解要简单太多,人果然得多思考。

一些注意事项:

引用空指针报错,详见下文:

leetcode链表题报错 runtime error: member access within null pointer of type ‘ListNode‘_member access within null pointer of type 'listnod-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值