import java.util.*;
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    // 双指针的方法,分别遍历两个链表,当其中任意一个指针到达对应的链表末尾后,重定向到另一个链表的头部
    // 这样可以想象为将连个链表合二为一,不用纠结两个链表长度不一的情况
    // 如果两个链表没有公共结点,则指针会同时到达另一个链表尾部的null的位置
    // 如果有公共节点,则指针会同时到达第一个公共结点
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        if(pHead1 == null || pHead2 == null) return null;

        ListNode node1 = pHead1;
        ListNode node2 = pHead2;
        // 为了满足时间复杂度O(n),这里不能写node1.next == null,这样没办法结束循环,如果再加入一个判断flag,又会超时
        // 这里写node1 == null(实际上是把null也看成了一个公共结点),则运行node的值为null,则满足了两个指针最终的值一定会相等,直接返回任意一个指针就可以了。
        while(node1 != node2){
            if(node1 == null){
                node1 = pHead2;
            }else{
                node1 = node1.next;
            }
            if(node2 == null){
                node2 = pHead1;
            }else{
                node2 = node2.next;
            }
        }

        return node1;
    }
}