import java.util.HashSet;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
//方法一:利用集合元素的唯一性
//特殊值处理,当链表1或者链表2为空链表时,两者没有公共节点
// if(pHead1 == null || pHead2 == null){
// return null;
// }
// //创建一个哈希集合
// HashSet<ListNode> hashSet = new HashSet<>();
// //遍历链表1,将链表1中的节点都放在哈希集合中
// while (pHead1 != null){
// hashSet.add(pHead1);
// pHead1 = pHead1.next; //节点移动
// }
// //遍历链表2,先判断链表1中的节点是否在哈希集合中,如果在,则该节点是两个链表的第一个公共节点;反之遍历下一个
// while (pHead2 != null){
// if(hashSet.contains(pHead2)){
// return pHead2;
// }
// pHead2 = pHead2.next; //节点移动
// }
// return null;
//方法二:利用数学特性,
//特殊值处理,当链表1或者链表2为空链表时,两者没有公共节点
if(pHead1 == null || pHead2 == null){
return null;
}
ListNode head2 = pHead2;
ListNode head1 = pHead1;
boolean flag = false;
//拼接后的链表,此时长度相等,开始遍历链表a与b,
while (pHead1 != null){
if(head1 == head2){//如果指针a与指针b同时指向同一个链表,则该节点为两个链表的第一个公共节点
return head1;
}else {//节点移动
if(head1.next == null){//如果指针a指向链表a的最后一个节点,则下一个节点为链表b的头节点
if(flag){
return null;
}else{
flag = true;
}
head1 = pHead2;
}else{
head1 = head1.next;
}
if(head2.next == null){//如果指针b指向链表b的最后一个节点,则下一个节点为链表a的头节点
head2 = pHead1;
}else {
head2 = head2.next;
}
}
}
return null;
}
}
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
//方法一:利用集合元素的唯一性
//特殊值处理,当链表1或者链表2为空链表时,两者没有公共节点
// if(pHead1 == null || pHead2 == null){
// return null;
// }
// //创建一个哈希集合
// HashSet<ListNode> hashSet = new HashSet<>();
// //遍历链表1,将链表1中的节点都放在哈希集合中
// while (pHead1 != null){
// hashSet.add(pHead1);
// pHead1 = pHead1.next; //节点移动
// }
// //遍历链表2,先判断链表1中的节点是否在哈希集合中,如果在,则该节点是两个链表的第一个公共节点;反之遍历下一个
// while (pHead2 != null){
// if(hashSet.contains(pHead2)){
// return pHead2;
// }
// pHead2 = pHead2.next; //节点移动
// }
// return null;
//方法二:利用数学特性,
//特殊值处理,当链表1或者链表2为空链表时,两者没有公共节点
if(pHead1 == null || pHead2 == null){
return null;
}
ListNode head2 = pHead2;
ListNode head1 = pHead1;
boolean flag = false;
//拼接后的链表,此时长度相等,开始遍历链表a与b,
while (pHead1 != null){
if(head1 == head2){//如果指针a与指针b同时指向同一个链表,则该节点为两个链表的第一个公共节点
return head1;
}else {//节点移动
if(head1.next == null){//如果指针a指向链表a的最后一个节点,则下一个节点为链表b的头节点
if(flag){
return null;
}else{
flag = true;
}
head1 = pHead2;
}else{
head1 = head1.next;
}
if(head2.next == null){//如果指针b指向链表b的最后一个节点,则下一个节点为链表a的头节点
head2 = pHead1;
}else {
head2 = head2.next;
}
}
}
return null;
}
}