寻找两个链表的第一个公共节点,提供两种解法:解法1、使用哈希,把第一个链表的所有节点用哈希保存起来,之后进行第二个链表的扫描,如果第二个链表的某个节点的哈希映射冲突(在map中已经存在),则该节点为第一个公共节点。空间复杂度O(max(m,n)),事件复杂度O(m+n)(有可能把两个链表都扫描完了)解法2、遍历两个链表,找出较长的那个链表,忽略较长链表的头部多出的一截(多出的一截不可能存在公共节点)然后依次对比节点是否相等,返回第一个节点相等的指针即可。空间复杂度O(1)事件复杂度O(m+n)(两个链表都进行了遍历,找出长度)
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
// 解法一:
// Map<ListNode,Integer> map = new HashMap<ListNode,Integer>();
// while(pHead1!=null){
// map.put(pHead1,pHead1.val);
// pHead1 = pHead1.next;
// }
// while(pHead2!=null){
// if(map.get(pHead2)!=null)return pHead2;
// else pHead2 = pHead2.next;
// }
// return null;
// 解法二:
int len1 = 0;
int len2 = 0;
ListNode p1 = pHead1;
ListNode p2 = pHead2;
while(p1!=null){len1++;p1=p1.next;}
while(p2!=null){len2++;p2=p2.next;}
ListNode maxlist = len1>len2?pHead1:pHead2;
ListNode minlist = len1>len2?pHead2:pHead1;
int count =0;
while(maxlist!=minlist){
count++;
if(count>Math.abs(len1-len2)){
minlist = minlist.next;
}
maxlist = maxlist.next;
}
return maxlist;
}
}
****