题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路:需计算链表长度
首先计算两个链表长度差值,让较长者先走完差值部分,再两个链表一起往下走.
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
int len1=0,len2=0;
ListNode tmp1=pHead1,tmp2=pHead2;
while(tmp1!=null){
len1++;
tmp1=tmp1.next;
}
while(tmp2!=null){
len2++;
tmp2=tmp2.next;
}
tmp1=pHead1;tmp2=pHead2;
if(len2>len1){
for(int i=0;i<len2-len1;i++){
tmp2=tmp2.next;
}
}
if(len1>len2){
for(int i=0;i<len1-len2;i++){
tmp1=tmp1.next;
}
}
ListNode res=null;
while(tmp1!=null&&tmp2!=null){
if(tmp1==tmp2){
res=tmp1;
break;
}
tmp1=tmp1.next;
tmp2=tmp2.next;
}
return res;
}
}
思路:无需计算链表长度
长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL;
长度不同有公共结点,第一遍差值就出来了,第二遍一起到公共结点;没有公共,一起到结尾NULL。(两个结点各自走的总长度会一致,即两条链表的总长度)
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode p1=pHead1,p2=pHead2;
while(p1!=p2){
p1=(p1==null?pHead2:p1.next);
p2=(p2==null?pHead1:p2.next);
}
return p1;
}
}