两个链表是一个‘Y’型,从头开始遍历不好弄,所以可以从后开始遍历,找到最后一个相同的节点就是答案。
如何从后开始呢,单链表只能从前往后遍历,所以会“后进先出”,就需要用到栈
class Solution {
public ListNode findFirstCommonNode(ListNode headA, ListNode headB) {
if(headA==null || headB==null) return null;
Stack<ListNode> stackA=new Stack(),stackB=new Stack();
while(headA!=null || headB!=null){
if(headA!=null){
stackA.push(headA);
headA=headA.next;
}
if(headB!=null){
stackB.push(headB);
headB=headB.next;
}
}
ListNode res=null;
while(stackA.size()>0 && stackB.size()>0){
if(stackA.peek()==stackB.peek()){
res=stackA.pop();
stackB.pop();
}else{
break;
}
}
return res;
}
}
也可以先遍历一个链表,用hashset存起来,再遍历另一条的时候,如果在set里已经有了,那就是公共节点了
class Solution {
public ListNode findFirstCommonNode(ListNode headA, ListNode headB) {
if(headA==null || headB==null) return null;
Set<ListNode> set=new HashSet();
while(headA!=null){
set.add(headA);
headA=headA.next;
}
while(headB!=null){
if(set.contains(headB)){
return headB;
}else{
headB=headB.next;
}
}
return null;
}
}