描述
输入两个链表,找出它们的第一个公共结点。
代码
思路:分别计算两个链表的长度,然后可以区分哪个链表更长,并且求出俩链表的长度差delta。然后先遍历长链表,让长链表先走delta步,接下来,两个链表同时遍历,直到两个引用指向同一个对象,返回该节点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1==null||pHead2==null){
return null;
}
if(pHead1==pHead2){
return pHead1;
}
int count1=0,count2=0;
for(ListNode node=pHead1;node!=null;node=node.next){
count1++;
}
for(ListNode node=pHead2;node!=null;node=node.next){
count2++;
}
ListNode longHead=null,shortHead=null;
if(count1>=count2){
longHead=pHead1;shortHead=pHead2;
}else{
longHead=pHead2;shortHead=pHead1;
}
int delta=Math.abs(count1-count2);
int i=0;ListNode node=null,nodeS=shortHead;
for(node=longHead;i<delta&&node!=null;node=node.next,i++);
while(node!=null&&nodeS!=null){
if(node==nodeS){
return node;
}
node=node.next;
nodeS=nodeS.next;
}
return null;
}
}