/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
            ListNode l1=pHead1;
            ListNode l2=pHead2;
        //使用两个指针N1,N2,一个从链表1的头节点开始遍历,
        //我们记为N1,一个从链表2的头节点开始遍历,我们记为N2。
        //相遇条件为两个指针相等 要么相等相遇 要么两个值都为null相遇
        //两个链表以相同速度行走,单看一个链表的轨迹就是一个圆形。
        //两个指针行走的路径形成了两个圆。路线相同长。以相同的速度行走最终一定会相遇。
        //
        while(l1!=l2){
            if (l1==null){
                l1=pHead2;//路径1 走到尽头 从路径2行走。形成一个圆。
            }else{
                l1=l1.next; //向下走
            }
            //以下同理
            if(l2==null){
                l2=pHead1;
            }else{
                l2=l2.next;
            }
        }
        //当循环退出一定会找到相同的公共节点 null也为一种情况。
        return l2;
    }
}

alt