剑指offer04 JZ52 两个链表的第一个公共结点
两个链表的第一个公共结点
https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=23257&ru=%2Fpractice%2Fd8b6b4358f774294a89de2a6ac4d9337&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D13
/*
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;
ListNode l2=pHead2;
//使用两个指针N1,N2,一个从链表1的头节点开始遍历,
//我们记为N1,一个从链表2的头节点开始遍历,我们记为N2。
//相遇条件为两个指针相等 要么相等相遇 要么两个值都为null相遇
//两个链表以相同速度行走,单看一个链表的轨迹就是一个圆形。
//两个指针行走的路径形成了两个圆。路线相同长。以相同的速度行走最终一定会相遇。
//
while(l1!=l2){
if (l1==null){
l1=pHead2;//路径1 走到尽头 从路径2行走。形成一个圆。
}else{
l1=l1.next; //向下走
}
//以下同理
if(l2==null){
l2=pHead1;
}else{
l2=l2.next;
}
}
//当循环退出一定会找到相同的公共节点 null也为一种情况。
return l2;
}
}