题目描述
输入两个链表,找出它们的第一个公共结点。
方法一
利用HashMap的特性,当添加第二个列表,遇到已经在map中的,直接返回该节点
package xidian.lili.niuke;
import java.util.HashMap;
import xidian.lili.niuke.FirstCommonNode.ListNode;
public class FirstCommonNode {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
HashMap<ListNode,Integer> map=new HashMap<ListNode, Integer>();
while(pHead1!=null){
map.put(pHead1, null);
pHead1=pHead1.next;
}
while(pHead2!=null){
if(map.containsKey(pHead2)){
return pHead2;
}
pHead2=pHead2.next;
}
return null;
}
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
}
方法二
第一个公共结点:要明白链表之间的第一个公共节点,当遇到第一个公共节点,之后的节点也会相同,就相当于合并为一条列表
所以先遍历完长的列表的长度差,然后开始一起遍历,直到找到共同的节点
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.HashMap;
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
int len1=getLen(pHead1);
int len2=getLen(pHead2);
ListNode cur1=pHead1;
ListNode cur2=pHead2;
if(len1<len2){
for(int i=0;i<len2-len1;i++){
cur2=cur2.next;
}
}
if(len1>len2){
for(int i=0;i<len1-len2;i++){
cur1=cur1.next;
}
}
while(cur1!=cur2){
cur1=cur1.next;
cur2=cur2.next;
}
return cur1;
}
private int getLen(ListNode pHead1) {
int len=0;
while(pHead1!=null){
len++;
pHead1=pHead1.next;
}
return len;
}
}