描述
输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
public class Jz36_FindFirstCommonNode {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if (null == pHead1 || null == pHead2) {
return null;
}
HashSet<ListNode> listNodeHashSet = new HashSet<>();
while (null != pHead1) {
listNodeHashSet.add(pHead1);
pHead1 = pHead1.next;
}
while (null != pHead2) {
if (listNodeHashSet.contains(pHead2)) {
return pHead2;
}
pHead2 = pHead2.next;
}
return null;
}
//计算两个列表的长度
public ListNode FindFirstCommonNode2(ListNode pHead1, ListNode pHead2) {
if (null == pHead1 || null == pHead2) {
return null;
}
int len1 = getListLen(pHead1);
int len2 = getListLen(pHead2);
if (len1 >= len2) {
int diff = len1 - len2;
while (diff > 0) {
pHead1 = pHead1.next;
diff--;
}
} else {
int diff = len2 - len1;
while (diff > 0) {
pHead2 = pHead2.next;
diff--;
}
}
while (null != pHead1 && null != pHead2) {
if (pHead1 == pHead2) {
return pHead1;
}
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
return null;
}
public int getListLen(ListNode head) {
ListNode cur = head;
int len = 0;
while (null != cur) {
len++;
cur = cur.next;
}
return len;
}
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
}