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;
}
}