import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
// 左程云老师讲过这道题。分别测量两条链表的长度length1和length2,计算二者的差值diff
// 先让较长链表走diff个结点,然后二者同时一次走一个结点,相遇的结点就是第一个公共节点
// 算法的时间复杂度O(N),额外空间复杂度O(1)
// 1.分别遍历一遍链表,得到总共有几个结点
if (pHead1 == null) {
return null;
}
if (pHead2 == null) {
return null;
}
// 确保两个链表都至少有一个结点
int length1 = 0;
int length2 = 0;
ListNode cur = pHead1;
while (cur != null) {
length1++;
cur = cur.next;
}
cur = pHead2;
while (cur != null) {
length2++;
cur = cur.next;
}
// 2.找到较长的链表并计算差值
ListNode longListHead = length1 >= length2 ? pHead1 : pHead2;
ListNode shortListHead = length1 >= length2 ? pHead2 : pHead1;
int diff = Math.abs(length1 - length2);
// 3.先让较长链表走diff个结点,然后二者同时一次走一个结点,相遇的结点就是第一个公共节点
ListNode longListCur = longListHead;
ListNode shortListCur = shortListHead;
while(diff > 0) {
longListCur = longListCur.next;
diff--;
}
// 4.此时,令longListCur和shortListCur同时一次往前走一个结点,直到它们相遇
while (longListCur != shortListCur) {
longListCur = longListCur.next;
shortListCur = shortListCur.next;
}
// 5.返回相遇的结点,就是第一个公共结点
return longListCur;
}
}