返回
剑指 Offer 160:相交链表 - 初探哈希表、双指针
前端
2024-01-18 21:51:28
算法简介
在相交链表问题中,你将面临两个链表,这两个链表可能在某个节点处相交,也可能不相交。你的任务是找到它们的相交节点。若链表不相交,则返回 null。
哈希表解法
哈希表的魅力在于其快速检索特性,是解决许多算法问题的得力助手。
我们首先将第一个链表的所有节点存储在一个哈希表中。然后,遍历第二个链表,检查每个节点是否在哈希表中。如果找到匹配的节点,则该节点即是两个链表的相交节点。
双指针解法
双指针法是一种巧妙的算法技巧,以两个指针同时遍历数据结构,从而实现更高效的遍历和比较。
我们设置两个指针,分别指向两个链表的头部。然后,同时向后移动这两个指针。当其中一个指针到达链表末尾时,将其重置为另一个链表的头部。这样,两个指针将在两个链表中交替移动。
如果两个链表相交,那么在某个时刻,两个指针将同时指向同一个节点,也就是相交节点。如果两个链表不相交,那么两个指针将永远不会指向同一个节点,最终都将到达各自链表的末尾。
代码实现
/**
* 哈希表解法
*
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
const getIntersectionNode = (headA, headB) => {
const map = new Map();
while (headA) {
map.set(headA, true);
headA = headA.next;
}
while (headB) {
if (map.has(headB)) {
return headB;
}
headB = headB.next;
}
return null;
};
/**
* 双指针解法
*
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
const getIntersectionNode = (headA, headB) => {
let pA = headA;
let pB = headB;
while (pA !== pB) {
pA = pA ? pA.next : headB;
pB = pB ? pB.next : headA;
}
return pA;
};
结语
相交链表问题的两种解法各有千秋,哈希表解法以空间换时间,双指针解法则以时间换空间。选择哪种解法取决于具体场景和你的偏好。我希望这篇文章能帮助你更深入地理解相交链表问题及其解法。
如果你想进一步探索 LeetCode 题目的解决方案,可以访问我们的网站,在那里你将找到更多精彩的文章和教程。
参考资料