**> # 两个链表的第一个公共结点
图解:**
思路:
1.设置两个节点head1和和head2,将两个节点分别位于两个链表头结点处
2.同时出发,一起向相应的链表的后面进行遍历,当两个节点位于同一地址的时候,就是两个链表的第一个公共节点
3.但是如果发现head1已经遍历完链表1,就让它从pHead2开始遍历链表2
** 4.同理:如果head2已经遍历完链表2,就让它从pHead1开始遍历链表1**
** 5.由于它们是同时出发的,所以到相遇的时候经过的时间是一样的,又因为速度也是一样的,所以最后相遇的时候经过的总路程是一样的,而由于是两个表交错着走,所以最后路程一样的位置就是两个链表的两个链表的公共节点**
** 6.如果没有公共节点,随后head1和head2都会走到null,此时head1==head2,会退出循环,返回null**
代码:
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) {
//设置两个节点head1和和head2,将两个节点分别位于两个链表头结点处
ListNode head1=pHead1;
ListNode head2=pHead2;
//同时出发,一起向相应的链表的后面进行遍历,当两个节点位于同一地址的时候,就是两个链表的第一个公共节点
//但是如果发现head1已经遍历完链表1,就让它从pHead2开始遍历链表2
//同理:如果head2已经遍历完链表2,就让它从pHead1开始遍历链表1
//由于它们是同时出发的,所以到相遇的时候经过的时间是一样的,又因为速度也是一样的,所以最后相遇的时候经过的总路程是一样的,而由于是两个表交错着走,所以最后路程一样的位置就是两个链表的两个链表的公共节点
//如果没有公共节点,随后head1和head2都会走到null,此时head1==head2,会退出循环,返回null
while(head1!=head2){
if(head1==null){
head1=pHead2;
}else{
head1=head1.next;
}
if(head2==null){
head2=pHead1;
}else{
head2=head2.next;
}
}
return head1;
}
}