题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
import java.util.HashMap;
public class 两个链表的第一个公共节点 {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode current1=pHead1;
ListNode current2=pHead2;
HashMap<ListNode, Integer>map=new HashMap<ListNode,Integer>();
if(current1==null||current2==null) return null;
while(current1!=null) {
map.put(current1, null);
current1=current1.next;
}
while(current2!=null) {
if(map.containsKey(current2)) return current2;
current2=current2.next;
}
return null;
}
/**
* 思路:如果有公共节点,1)若两个链表长度相等,那么遍历一遍后,在某个时刻,p1 == p2
* 2)若两个链表长度不相等,那么短的那个链表的指针pn(也就是p1或p2)
* 必先为null,那么这时再另pn = 链表头节点。经过一段时间后,
* 则一定会出现p1 == p2。
* 如果没有公共节点:这种情况可以看成是公共节点为null,顾不用再考虑。
*/
public ListNode FindFirstCommonNode2(ListNode pHead1, ListNode pHead2) {
ListNode p1 = pHead1;
ListNode p2 = pHead2;
while(p1 != p2) {
if(p1 != null) p1 = p1.next; //防止空指针异常
if(p2 != null) p2 = p2.next;
if(p1 != p2) { //当两个链表长度不想等
if(p1 == null) p1 = pHead1;
if(p2 == null) p2 = pHead2;
}
}
return p1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}