输入两个链表,找出它们的第一个公共结点。
当不存在公共节点时,返回空节点。
样例
给出两个链表如下所示:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
输出第一个公共节点c1
方法一:
有两个指针 p指的A链表头部 q指的是B链表的头部 ,pq 同时走,一旦走到头就换到另一个链表的头上,p就到B链表,q就到A链表,如果是有公共节点的他们会相遇在公共结单,如果没有公共节点就会相遇在null
public ListNode findFirstCommonNode(ListNode headA, ListNode headB) {
ListNode p = headA;
ListNode q = headB;
while (p != q) {
if( q!=null) q = q .next;
else q = headA;
if(p!=null) p = p .next;
else p = headB;
}
return q;
}
方法二:
两个链表是一个‘Y’型,从头开始遍历不好弄,所以可以从后开始遍历,找到最后一个相同的节点就是答案。
如何从后开始呢,单链表只能从前往后遍历,所以会“后进先出”,就需要用到栈
public static ListNode findFirstCommonNode(ListNode headA, ListNode headB) {
Stack<ListNode> stack1 = new Stack<>();
Stack<ListNode> stack2 = new Stack<>();
ListNode p = headA;
ListNode q = headB;
while(p!=null){
stack1.push(p);
p = p.next;
}
while(q!=null){
stack2.push(q);
q = q.next;
}
ListNode res = null;
while(stack1.size()>0){
if(stack1.peek()==stack2.peek()){
res = stack1.pop();
stack2.pop();
}
else{
return res;
}
}
return res;
}