目录
两个链表的第一个公共结点
描述
输入两个无环的单链表,找出它们的第一个公共结点。
(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
备注
链表的数据结构如下:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
方法一:双指针
让两个指针分别从两个链表头节点开始遍历,在经历相同的结点数后到达第一个公共节点,
为了让两个指针遍历相同的节点,我们让phead1的后面接上phead2,让phead2的后面接上phead1,这样两个链表的长度都为m+n(假设phead1的链表长度为m,phead2的链表长度为n),
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;
}
}
可以看到这种方法速度非常快,
方法二:栈
利用栈我们可以将两个链表的元素入两个不同的栈,然后对栈进行出栈操作,当出栈的元素不相同时,返回上一个元素就是结果节点了,
import java.util.Stack;
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
Stack<ListNode> stack1=new Stack();
Stack<ListNode> stack2=new Stack();
Stack<ListNode> res=new Stack();
while(pHead1!=null){
stack1.push(pHead1);
pHead1=pHead1.next;
}
while(pHead2!=null){
stack2.push(pHead2);
pHead2=pHead2.next;
}
ListNode p1,p2;
while(!stack1.isEmpty()&&!stack2.isEmpty()){
p1=stack1.pop();
p2=stack2.pop();
if(p1==p2){
res.push(p1);
}else{
break;
}
}
return res.isEmpty()==true?null:res.pop();
}
}
该方法因为使用了堆栈,运行时间和内存都稍差一点,