问: 输入两个链表,找出它们的第一个公共结点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
//1、找到链表的长度差a。
//2、让长的先走a步。
//3、然后在进行比较,如果哪个节点之后所有的值都相同,直至到尾节点。则那个节点就是第一个公共节点。
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1==null || pHead2 == null){
return null;
}
int pH1 = findListNodeLength(pHead1);
int pH2 = findListNodeLength(pHead2);
if(pH1>pH2){
pHead1 = runlength(pH1-pH2,pHead1);
}else{
pHead2 = runlength(pH2-pH1,pHead2);
}
//进行挨个比较
return compareListNode(pHead1,pHead2);
}
//计算2个链表的长度
int findListNodeLength(ListNode node){
int sum=0;
while(node.next!=null){
sum++;
node=node.next;
}
return sum;
}
//先走长度差步
ListNode runlength(int length,ListNode node){
while(length>0){
node=node.next;
length--;
}
return node;
}
//进行比较
ListNode compareListNode(ListNode pHead1, ListNode pHead2){
ListNode tmp=pHead1;
while(pHead1!=null){
if(pHead1.val==pHead2.val){
pHead1=pHead1.next;
pHead2=pHead2.next;
}else{
pHead1=pHead1.next;
pHead2=pHead2.next;
tmp=pHead1;
}
}
return tmp;
}
}