当前位置: 面试刷题>> 两个链表的交叉 (经典算法题500道)


### 题目描述补充 给定两个单向链表 `headA` 和 `headB`,这两个链表在某一节点处相交,相交之后的节点值都相同,返回相交点的节点。如果两个链表不相交,则返回 `null`。 注意: 1. 如果两个链表没有交点,则它们仍然是独立的,不会互相引用。 2. 链表中的节点值可能重复。 3. 当链表 `A` 和链表 `B` 相交时,我们假设在交点之前的节点都是独立的,且不会存在循环。 ### 示例 假设链表 A 为 `1 -> 2 -> 3 -> 4 -> 5`,链表 B 为 `6 -> 7 -> 4 -> 5`,则相交点是 `4 -> 5`。 ### 解题思路 为了找到相交点,我们可以使用双指针法。首先,我们让两个指针分别遍历两个链表,当到达链表末尾时,将指针移向另一个链表的头部继续遍历。由于两个链表在相交点之后是共享的,所以当两个指针都遍历完它们各自的链表并继续遍历对方链表时,它们会在相交点相遇。 ### PHP 示例代码 ```php val = $val; $this->next = $next; } } function getIntersectionNode($headA, $headB) { $pA = $headA; $pB = $headB; while ($pA !== $pB) { $pA = $pA ? $pA->next : $headB; $pB = $pB ? $pB->next : $headA; } return $pA; } // 示例用法 // 假设构建了两个链表并使其相交 // ... // 调用函数并输出结果 // $intersectionNode = getIntersectionNode($headA, $headB); // if ($intersectionNode) { // echo "相交节点的值为: " . $intersectionNode->val; // } else { // echo "链表不相交"; // } ?> ``` ### Python 示例代码 ```python class ListNode: def __init__(self, x): self.val = x self.next = None def getIntersectionNode(headA, headB): pA, pB = headA, headB while pA != pB: pA = pA.next if pA else headB pB = pB.next if pB else headA return pA # 示例用法 # 假设构建了两个链表并使其相交 # ... # intersection_node = getIntersectionNode(headA, headB) # if intersection_node: # print("相交节点的值为:", intersection_node.val) # else: # print("链表不相交") ``` ### JavaScript 示例代码 ```javascript function ListNode(val) { this.val = val; this.next = null; } function getIntersectionNode(headA, headB) { let pA = headA, pB = headB; while (pA !== pB) { pA = pA ? pA.next : headB; pB = pB ? pB.next : headA; } return pA; } // 示例用法 // 假设构建了两个链表并使其相交 // ... // let intersectionNode = getIntersectionNode(headA, headB); // if (intersectionNode) { // console.log("相交节点的值为:", intersectionNode.val); // } else { // console.log("链表不相交"); // } ``` 码小课网站中有更多关于链表、算法和数据结构等相关内容的分享,欢迎大家学习交流。
推荐面试题