寻找两个链表的第一个公共节点
(牛客网—牛客题霸算法篇—NC66)
题目描述
输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。
思路
Java实现
暴力循环
两层循环,依次比较
两指针法
使用两个指针N1,N2,一个从链表1的头节点开始遍历,我们记为N1,一个从链表2的头节点开始遍历,我们记为N2。
让N1和N2一起遍历,当N1先走完链表1的尽头(为null)的时候,则从链表2的头节点继续遍历,同样,如果N2先走完了链表2的尽头,则从链表1的头节点继续遍历,也就是说,N1和N2都会遍历链表1和链表2。
因为两个指针,同样的速度,走完同样长度(链表1+链表2),不管两条链表有无相同节点,都能够到达同时到达终点。(原理:a+b=b+a)
代码实现
暴力循环
/*
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 temp=pHead2;
while(pHead1!=null){
while(temp!=null){
if(pHead1==temp){
return pHead1;
}
temp=temp.next;
}
pHead1=pHead1.next;
temp=pHead2;
}
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) {
ListNode p1=pHead1;
ListNode p2=pHead2;
while(p1!=p2){
p1=(p1==null)?pHead2:p1.next;
p2=(p2==null)?pHead1:p2.next;
}
return p1;
}
}