题目
两个链表的第一个公共结点
描述
输入两个链表,找出它们的第一个公共结点。
思路
- 暴力法,时间复杂度为On的平方….
- 链表特性
代码
- 方法一
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1==null||pHead2==null)
return null;
Map<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;
}
- 方法二
时间复杂度为O(m+n) 空间复杂度O(m+n)
//方法二
public ListNode FindFirstCommonNode2(ListNode pHead1, ListNode pHead2) {
if(pHead1==null||pHead2==null)
return null;
int length1 = length(pHead1);
int length2 = length(pHead2);
int diffLength = length1-length2;
//让长度长的链表先走相差的步数
if(diffLength<0){//length2长,先走几步
for(int i=0;i<Math.abs(diffLength);i++)
pHead2 = pHead2.next;
}else{
for(int i=0;i<diffLength;i++)
pHead1 = pHead1.next;
}
//然后一起走
while (pHead1!=null&&pHead2!=null&&pHead1!=pHead2){
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
if(diffLength>0)
return pHead1;
return pHead2; //返回
}
//获取链表长度
public int length(ListNode listNode){
int t = 0;
while (listNode!=null){
t++;
listNode = listNode.next;
}
return t;
}