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