设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。
当访问链表 A 的指针访问到链表尾部时,令它从链表 B 的头部重新开始访问链表 B;同样地,当访问链表 B 的指针访问到链表尾部时,令它从链表 A 的头部重新开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点。
长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL
长度不同有公共结点,第一遍差值就出来了,第二遍一起到公共结点;没有公共,一起到结尾NULL。
①长度相同有公共结点,p1等于p2。
②长度相同无公共结点,都等于NULL。
③长度不同有公共结点,p1为空转p2,p2为空转p1,走着走着就同步了,最后p1等于p2。
④长度不同无公共结点,最后都等于NULL。
代码所基于的想法是,将两个链表L1和L2进行拼接,得到L1+L2和L2+L1两个拼接结果。这两个拼接后的链表长度是一致的,那么逐个判断即可。
/*
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,l2=pHead2;
while(l1!=l2){
l1=(l1==null)? pHead2:l1.next;
l2=(l2==null)? pHead1:l2.next;
}
return l1;
}
}