题目描述
输入两个链表,找出它们的第一个公共结点。
思路
从公共结点向后,两链表是一样的,区别就是公共结点之前的部分
分别求出两链表长度,哪条长就先遍历哪条,把多出来的那一部分先遍历掉
剩下的两条链表长度相等,再同时继续向后遍历,直到找到相同的结点
实现
/*
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;
ListNode cur1=pHead1; //尽量不直接操作头结点
ListNode cur2=pHead2;
//两链表的长度
int len1=getLen(pHead1);
int len2=getLen(pHead2);
int len=Math.abs(len1-len2); //两链表长度之差(不知道哪个更长)
//若链表1更长,先把链表1多出来的部分遍历掉
if(len1>len2){
while(len>0){
cur1=cur1.next;
len--;
}
}
//若链表2更长,先把链表2多出来的部分遍历掉
if(len2>len1){
while(len>0){
cur2=cur2.next;
len--;
}
}
//遍历完多出来的链表后,剩下的链表长度相等了,同时比那里,直到找到相同结点
while(cur1!=cur2){
cur1=cur1.next;
cur2=cur2.next;
}
return cur1;
}
//定义一个求链表长度的函数
public int getLen(ListNode Node){
int len=0;
while(Node!=null){
Node=Node.next;
len++;
}
return len;
}
}