题目描述
输入两个链表,找出它们的第一个公共结点。
链表的定义如下:
/*
public class ListNode {
int val;
ListNode next = null;
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
this.val = val;
}
}*/
看到这道题的时候,很多人的第一反应就是采用蛮力的方法:在第一个链表上顺序遍历每个节点,每遍历到一个节点的时候,在第二个链表上顺序遍历每个节点。如果第二个链表上的节点和第一个链表上的节点一样,就说明两个链表在节点上重合,于是就找到了公共的节点。但是这种方法的时间复杂度是非常高的,所以说不是什么明智的方法。
略加思索,我就准备用压栈的方法。建立一个栈,判断链表元素在栈中是否存在,存在就返回节点,不存在就压入栈中,如此循环,直到两个链表都为空。
代码:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.*;
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
//建立栈
Stack<Integer> stack = new Stack<Integer>();
//同时对两个链表开始循环,链表元素在栈中存在就返回节点,不存在就把链表元素压栈
while((pHead1 !=null) &&(pHead2 != null)){
if(-1 ==stack.search(pHead1.val)){
stack.push(pHead1.val);
pHead1 = pHead1.next;
}else{
return pHead1;
}
if(-1 ==stack.search(pHead2.val)){
stack.push(pHead2.val);
pHead2 = pHead2.next;
}else{
return pHead2;
}
}
//链表1未遍历完的情况
while(pHead1 !=null){
if(-1 ==stack.search(pHead1.val)){
stack.push(pHead1.val);
pHead1 = pHead1.next;
}else{
return pHead1;
}
}
//链表2未遍历完的情况
while(pHead2 !=null){
if(-1 ==stack.search(pHead2.val)){
stack.push(pHead2.val);
pHead2 = pHead2.next;
}else{
return pHead2;
}
}
return null;
}
}