题目描述
输入两个链表,找出它们的第一个公共结点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
分析:如果两个单向链表有公共的结点,那么这两个链表从某一个结点开始,他们的next结点都指向同一个结点,但由于是单向链表的结点,每个结点都只有一个next结点,因此从第一个公共结点开始,之后他们所有结点都是重合的,不可能出现分支。
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
int len1 = getLeng(pHead1);
int len2 = getLeng(pHead2);
ListNode lon = pHead1;
ListNode shor = pHead2;
int len = len1 - len2;
//获得长链表和短链表
if (len2 > len1) {
lon = pHead2;
shor = pHead1;
len = len2 - len1;
}
//使两个链表的开始结点到最后的结点的距离相同
for (int i = 0; i < len; i++) {
lon = lon.next;
}
//同时遍历两个链表找到第一个相同的结点
while (lon != null && shor != null && lon.val != shor.val) {
lon=lon.next;
shor=shor.next;
}
return lon;
}
//获取链表的长度
private int getLeng(ListNode pHead) {
int len = 0;
while (pHead != null) {
len++;
pHead = pHead.next;
}
return len;
}