160. 相交链表
题解
哈希表

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {Set<ListNode> set = new HashSet<>();while (headA != null) {set.add(headA);headA = headA.next;}while (headB != null) {if (set.contains(headB)) {return headB;}set.add(headB);headB = headB.next;}return null;}}
双指针
- 头节点 headA 到 node 前,共有
a−c个节点; - 头节点 headB 到 node 前,共有
b−c个节点;

考虑构建两个节点指针 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 示例的算法执行过程。

class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode A = headA;ListNode B = headB;while (A != B) {A = (A == null ? headB : A.next);B = (B == null ? headA : B.next);}return A;}}

