题目描述:输入两个链表,找出它们的第一个公共结点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.Stack;
public class Solution {
/*
思路1:最简单的思路就是对于链表1的每个节点,都和链表2的每个节点进行比较,直到找到相等的节点
但是这种方法时间复杂度很高,为O(n^2)
思路2:因为链表实单向的,也就是说当两个链表出现公共节点,那么他们后面的节点都会是公共节点,
基于这个思想,我们可以从链表的尾部开始进行遍历,直到找到第一个不相等的节点
思路3:因为思路2要使用2个栈来存储两个链表的元素,因此增加了空间的消耗,还有一种思路可以不用增加
空间的消耗,因为链表的公共节点以后的节点都是相同的,因此链表是从后面对齐的,因此可以先分别
遍历两个列表,得到两个链表的长度,然后可以得到他们相差的节点数diff,让长的链表先走diff个
节点,然后两个链表一起走,直到找到第一个相同的节点
*/
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
//我们先对两个链表进行遍历来到链表的尾部,但是由于链表是单向的,所以我们要把之前的节点
//保存下来,因为节点是从尾向头比较,符合后进先出的特点,因此我们创建两个栈来保存两个链表
//的节点
if(pHead1 == null || pHead2 == null){
return null;
}
Stack<ListNode> s1 = new Stack<>();
Stack<ListNode> s2 = new Stack<>();
ListNode p1 = pHead1;
ListNode p2 = pHead2;
//对链表1进行遍历
while(p1 != null){
s1.push(p1);
p1 = p1.next;
}
//对链表2进行遍历
while(p2 != null){
s2.push(p2);
p2 = p2.next;
}
ListNode result = null;
while(!s1.isEmpty() && !s2.isEmpty()){
ListNode top1 = s1.pop();
ListNode top2 = s2.pop();
if(top1 != top2){
return result;
}else{
result = top1;
}
}
return result;
}
}