两个链表的第一个公共结点
Posted 氵冫丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个链表的第一个公共结点相关的知识,希望对你有一定的参考价值。
题目
输入两个链表,找出它们的第一个公共结点。
解题
说明:
1.单链表
2.相交后不会分开,因为分开后一个结点有两个下一个结点就不是单链表了
两个链表呈
如果两个链表两个指针向前走,相遇结点就是第一个公共结点,但是两个指针走的长度不一样
两个指针走了不同长度的
如果求出两个链表的长度:
若a走x,b走y后相遇
有下面等式:
等式相减:
两个链表长度的差,就是两个指针走过的结点个数的差
所以,长的链表,先走这个差值
后,两个指针一起走
相遇后就是第一个公共结点了
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1 == null || pHead2 ==null)
return null;
ListNode p1 = pHead1;
ListNode p2 = pHead2;
int p1Len = depth(pHead1);
int p2Len = depth(pHead2);
if(p2Len >p1Len)
return FindFirstCommonNode(pHead2,pHead1);
int diff = p1Len - p2Len;
while(diff!=0){
p1 = p1.next;
diff--;
}
while(p2Len>0){
if(p1 == p2)
return p1;
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
public int depth(ListNode head){
if(head == null)
return 0;
if(head.next == null)
return 1;
return 1 + depth(head.next);
}
}
讨论中看到用Hash
记录第一个链表出现的每个结点
再遍历第二个链表,判断map中是否已经存在
/*
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) {
ListNode p1 = pHead1;
ListNode p2 = pHead2;
HashMap<ListNode, Integer> hashMap = new HashMap<ListNode, Integer>();
while (p1 != null) {
if (hashMap.containsKey(p1)){
hashMap.put(p1,hashMap.get(p1)+1);
}else
hashMap.put(p1, 1);
p1 = p1.next;
}
while (p2 != null) {
if (hashMap.containsKey(p2))
return p2;
p2 = p2.next;
}
return null;
}
}
讨论中下面方法理解不透
import java.util.HashMap;
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode p1 = pHead1;
ListNode p2 = pHead2;
while(p1!=p2){
p1 = (p1==null ? pHead2 : p1.next);
p2 = (p2==null ? pHead1 : p2.next);
}
return p1;
}
}
以上是关于两个链表的第一个公共结点的主要内容,如果未能解决你的问题,请参考以下文章