**
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
首先要理解什么是公共节点,并不是两个节点的值相同就是公共节点。
而是在第一链表和第二链表中都存在一个节点,该节点往后的子链表在两个链表中是相同的。
如下图中链表就是两个链表的公共链表,而节点6就是第一个公共节点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode current1 = pHead1;//新建链表
ListNode current2 = pHead2;
if(current1 == null || current2 == null)
{
return null;
}
int len1 = findLength(current1);//获取链表长度
int len2 = findLength(current2);
if(len1>len2)
{
current1 = walkStep(current1,len1-len2);//若len1>len2,则先通过遍历current1将两链表对齐
}
else if(len2>len1)
{
current2 = walkStep(current2,len2-len1);
}
while(current1 != current2)//若链表当前值不相等,则两链表同时向后遍历,直至相等返回其中一个链表
{
current1 = current1.next;
current2 = current2.next;
}
return current1;
}
public static int findLength(ListNode current)
{
if(current == null)
{
return 0;
}
int count = 0;
while(current != null)
{
count++;
current = current.next;
}
return count;
}
public ListNode walkStep(ListNode current,int num)
{
for(int x=0;x<num;x++)
{
current = current.next;//遍历链表
}
return current;
}
}