题解 | 简单易懂,注释详细
两个链表的第一个公共结点
http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46
/*
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 dummy1 = pHead1;
ListNode dummy2 = pHead2;
int len1 = 0;
int len2 = 0;
// 统计两个链表的长度
while (dummy1 != null) {
dummy1 = dummy1.next;
len1++;
}
while (dummy2 != null) {
dummy2 = dummy2.next;
len2++;
}
if (len1 == 0 || len2 == 0) {
return null;
}
// 找到较长的列表放在第一位
if (len1 > len2) {
return find(len1 - len2, pHead1, pHead2);
} else {
return find(len2 - len1, pHead2, pHead1);
}
}
private ListNode find(int gap, ListNode pHead1, ListNode pHead2) {
// 较长的链表先走多出的长度
for (int i = 0; i < gap; i++) {
pHead1 = pHead1.next;
}
// 这时候剩下的长度一样多,只要不相等就一直向后
while (pHead1 != null && pHead2 != null && pHead1 != pHead2) {
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
return pHead1;
}
}