“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
输入两个链表,找出它们的第一个公共节点。
在节点 c1 开始相交。
示例 1:
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
示例2:
输入: s = " fly me to the moon "
输出: 4 解释: 最后一个单词是“moon”,长度为4。
二、思路分析:
哈希法
哈希大法好,遇到重复问题,应该会第一时间思考到使用哈希表。但哈希法实现比较简单,这里不多做赘述了。
双指针
我们要知道如果两个链表发生了重合,那么意味着从重合节点开始,两个链表后面的元素都是相同的。而且只有两个链表都不是空链表时,才会出现相交清空,因此我们首先判断一些是否存在空链表的特殊临界情况。
我们创建两个指针 pa pb 分别指向两个链表的头指针,然后依次遍历两个链表的节点:
那我们双指针会如何移动那?
- 每次遍历都需要同步移动指针 pa 和 pb
- 如果 pa 指针指向非空,则将 pa 指向下一个节点;如果 pb 指针指向非空,同样将 pb 指针指向下一个节点
- 如果 pa 指向空,则将其指向至链表B的头节点;对 pa 同样处理
- 当 pa 和 pb 指向同一元素或者都指向为空时,返回指向节点或者null
三、AC 代码:
var getIntersectionNode = function(headA, headB) {
if (headA === null || headB === null) {
return null;
}
let pa = headA, pb = headB;
while (pa !== pb) {
if (pa === null) {
pa = headB;
}else {
pa = pa.next
}
if (pb === null) {
pb = headA;
}else {
pb = pb.next
}
}
return pa;
};
四、总结:
做好双指针,走遍天下都不怕。 最近刷题都没来得及总结,只能今夜连夜总结了。