零 标题:算法(leetcode,附思维导图 + 全部解法)300题之(160)相交链表
一 题目描述



二 解法总览(思维导图)

三 全部解法
1 方案1
1)代码:
// 方案1 “自己。哈希法(JS里的Map数据结构)”。
// 思路:
// 1)状态初始化:resMap = new Map(), resNode = null; 。
// 2)核心1:遍历 链表A ,将每个节点存入 哈希resMap 中。
// 3)核心2:遍历 链表B 。
// 3.1)若 当前节点是否存在于 哈希resMap 中,则 resNode 置为当前节点 并 退出遍历。
// 4)返回结果 resNode 。
var getIntersectionNode = function(headA, headB) {
// 1)状态初始化:resMap = new Map(), resNode = null; 。
let resMap = new Map(),
resNode = null;
// 2)核心1:遍历 链表A ,将每个节点存入 哈希resMap 中。
while (headA) {
resMap.set(headA, 1);
headA = headA.next;
}
// 3)核心2:遍历 链表B 。
while (headB) {
// 3.1)若 当前节点是否存在于 哈希resMap 中,则 resNode 置为当前节点 并 退出遍历。
if (resMap.has(headB)) {
resNode = headB;
break;
}
headB = headB.next;
}
// 4)返回结果 resNode 。
return resNode;
}
2 方案2
1)代码:
// 方案2 “双指针法。”。
// 参考:
// 1)https://leetcode.cn/problems/intersection-of-two-linked-lists/solution/xiang-jiao-lian-biao-by-leetcode-solutio-a8jn/
// 思路:
// 1)每步操作需要同时更新指针 pA 和 pB。
// 2)若 指针 pA 不为空,则 将指针 pA 移到下一个节点;若 指针 pB 不为空,则 将指针 pB 移到下一个节点。
// 3)若 指针 pA 为空,则 将指针 pA 移到链表 headB 的头节点;若 指针 pB 为空,则 将指针 pB 移到链表 headA 的头节点。
// 4)若 当指针 pA 和 pB 指向同一个节点 或 都为空时,则 返回它们指向的节点 或 null 。
var getIntersectionNode = function(headA, headB) {
let pA = headA, pB = headB;
while (pA !== pB) {
pA = pA === null ? headB : pA.next;
pB = pB === null ? headA : pB.next;
}
return pA;
}
四 资源分享 & 更多
1 历史文章 - 总览

2 博主简介
码农三少 ,一个致力于编写 极简、但齐全题解(算法) 的博主。
专注于 一题多解、结构化思维 ,欢迎一起刷穿 LeetCode ~
网友评论