一、题目描述:
代码随想录链接
LeetCode题目链接
面试题 02.07. 链表相交 - 力扣(LeetCode)
明确“链表相交”的含义:
两个链表指针指向的同一结点,而不是存储数值相同的两个结点;
因此判断条件不是值相同,而是指针相同。
二、涉及的基本知识:
链表知识的综合运用,前边均已提及,此处不再细说
三、解题思路:
因为两个链表的长度可能不同,故不能直接同步遍历寻找;
因为翻转链表被ban掉,先翻转再同步遍历,再翻转回去
因为虚拟头结点被ban掉,循环嵌套(外层遍历A,内层遍历B)无法处理子链表等特殊情况;
最优解是随想录给的尾部对齐,再从相同位置同步遍历查找,非常巧妙。
特殊情况:
1.不相交
2.子链表(如{2,3}和{1,2,3})
3.空链表
四、代码
第一次尝试,翻转链表同步遍历;
既错会了链表相交的意思,又改变了链表结构,取巧失败:
第二次尝试,循环嵌套;
嵌套了三层循环,虽然这个时候还是没能正确理解“链表相交”,在按值相等来寻找,但是把一个对我来说比较复杂的嵌套循环想法变成代码实现出来,还是很有成就感的
(好不容易写出来,发现case1运行不通过的时候真的破大防,好好审题的重要性)
第三次尝试,循环嵌套;
这时候终于理解题目目的了,指针相同比值相同更好处理,两层循环可解决大部分问题;
但是由于不能使用虚拟头结点,导致子链表这一特殊情况处理起来非常复杂,代码泛用性较差,目前还没解决这个问题:
第四次尝试,对齐后同步遍历;
非常巧妙的思路,比循环暴力破解要简单太多,人果然得多思考。
一些注意事项:
引用空指针报错,详见下文: