/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ /* 方法一利用hashmap import java.util.HashMap; public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { //定义两个指针 if(pHead1==null||pHead2==null){ return null; } ListNode p1=pHead1; ListNode p2=pHead2; HashMap<ListNode,Integer> hash=new HashMap<ListNode,Integer>(); while(p1!=null){ hash.put(p1,null); p1=p1.next; } ListNode result=null; while(p2!=null){ if(hash.containsKey(p2)){ result=p2; //结束整个循环 break; } p2=p2.next; } return result; } }*/ //方法二先计算两个链表的长度,如果有公共结点,则公共结点之后所有的结点都是公共结点 //因为每个链表只能有一个指针 public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { //定义两个指针 if(pHead1==null||pHead2==null){ return null; } ListNode p1=pHead1; ListNode p2=pHead2; //计算两个链表的长度 int lengthOfpHead1=0; int lengthOfpHead2=0; while(p1!=null){ lengthOfpHead1++; p1=p1.next; } while(p2!=null){ lengthOfpHead2++; p2=p2.next; } //因为上面求取长度时两个指针都位于末尾了,防止java.lang.NullPointerException** //p1与p2必须重新赋值** p1=pHead1; p2=pHead2; int differLength=lengthOfpHead1-lengthOfpHead2; ListNode result=null; if(differLength>=0){ while(differLength>0){ p1=p1.next; --differLength; } while(p2!=null){ if (p1.next==null&&p2.next==null){ result=null; } if(p1==p2){ result=p2; break; } p1=p1.next; p2=p2.next; } }else{ while(differLength<0){ p2=p2.next; ++differLength; } while(p1!=null){ if (p1.next==null&&p2.next==null){ result=null; } if(p1==p2){ result=p1; break; } p1=p1.next; p2=p2.next; } } return result; } }