题目描述
输入两个链表,找出它们的第一个公共结点。
思想
1.先判断两个链表是否会相交(最后一个节点的元素相等肯定相交)
2.求得两个链表的长度,(假设len1>len2),先让链表1遍历len1-len2个节点到节点p(p到链表1尾节点的长度和head2到链表2尾节点的长度相等),这时同时遍历两个链表,直到有相同的节点为止。
实现代码
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1==null || pHead2==null){
return null;
}
// 1. 先判断是否会相交,若相交,则最后一个元素肯定相同
ListNode t1 = pHead1;
int len1=0,len2=0;
ListNode t2 = pHead2;
while(t1 != null){
t1 = t1.next;
len1++;
}
while(t2 != null){
t2 = t2.next;
len2++;
}
if(t1 != t2){
return null;
}
// 2. 找第一个公共节点
ListNode p1 = pHead1;
ListNode p2 = pHead2;
if(len1 > len2){
int k = len1 - len2;
while(k!=0){
p1 = p1.next;
k--;
}
}else{
int k = len2 - len1;
while(k!=0){
p2 = p2.next;
k--;
}
}
while(p1 != p2){
p1 = p1.next;
p2 = p2.next;
}
return p1;
}