import java.util.HashMap;
import java.util.Map;
/**
* 两个链表的第一个公共节点
*
* 输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
*/
public class JZ036FindFirstCommonNode {
/**
* 双指针
* @param pHead1
* @param pHead2
* @return
*/
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if (pHead1 == null || pHead2 == null) {
return null;
}
if (pHead1 == pHead2) {
return pHead1;
}
int pHead1Len = getLength(pHead1);
int pHead2Len = getLength(pHead2);
if (pHead1Len > pHead2Len) {
for (int i = 0; i < (pHead1Len - pHead2Len); i++) {
pHead1 = pHead1.next;
}
} else {
for (int i = 0; i < (pHead2Len - pHead1Len); i++) {
pHead2 = pHead2.next;
}
}
while (pHead1 != null && pHead2 != null) {
if (pHead1 == pHead2) {
return pHead1;
} else {
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
}
return null;
}
private int getLength(ListNode head) {
int length = 0;
ListNode curNode = head;
while (curNode != null) {
length++;
curNode = curNode.next;
}
return length;
}
/**
* HashMap,判断是否有Key
* @param pHead1
* @param pHead2
* @return
*/
public ListNode FindFirstCommonNode2(ListNode pHead1, ListNode pHead2) {
if (pHead1 == null || pHead2 == null) {
return null;
}
if (pHead1 == pHead2) {
return pHead1;
}
Map<ListNode, Integer> map = new HashMap<>();
while (pHead1 != null) {
map.put(pHead1, null);
pHead1 = pHead1.next;
}
while (pHead2 != null) {
if (map.containsKey(pHead2)) {
return pHead2;
}
}
return null;
}
}