160. 相交链表

image.png
image.png

题解

哈希表

image.png

  1. public class Solution {
  2. public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
  3. Set<ListNode> set = new HashSet<>();
  4. while (headA != null) {
  5. set.add(headA);
  6. headA = headA.next;
  7. }
  8. while (headB != null) {
  9. if (set.contains(headB)) {
  10. return headB;
  11. }
  12. set.add(headB);
  13. headB = headB.next;
  14. }
  15. return null;
  16. }
  17. }

双指针

来源:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/solution/intersection-of-two-linked-lists-shuang-zhi-zhen-l/

  • 头节点 headA 到 node 前,共有 a−c 个节点;
  • 头节点 headB 到 node 前,共有 b−c 个节点;

image.png
考虑构建两个节点指针 A , B 分别指向两链表头节点 headA , headB ,做如下操作:

  • 指针 A 先遍历完链表 headA ,再开始遍历链表 headB ,当走到 node 时,共走步数为:a + (b - c)
  • 指针 B 先遍历完链表 headB ,再开始遍历链表 headA ,当走到 node 时,共走步数为:b + (a - c)

如下式所示,此时指针 A , B 重合,并有两种情况:a + (b - c) = b + (a - c)

  • 若两链表 有 公共尾部 (即 c > 0) :指针 A , B 同时指向「第一个公共节点」node 。
  • 若两链表 无 公共尾部 (即 c = 0) :指针 A , B 同时指向 null

如下图所示,为 a = 5, b = 3, c = 2 示例的算法执行过程。
2021-11-02 11-38-42.2021-11-02 11_39_32.gif
image.png

  1. class Solution {
  2. public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
  3. ListNode A = headA;
  4. ListNode B = headB;
  5. while (A != B) {
  6. A = (A == null ? headB : A.next);
  7. B = (B == null ? headA : B.next);
  8. }
  9. return A;
  10. }
  11. }