题目描述
输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
数据范围: n≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)
输入描述:
输入分为是3段,第一段是第一个链表的非公共部分,第二段是第二个链表的非公共部分,第三段是第一个链表和第二个链表的公共部分。 后台会将这3个参数组装为两个链表,并将这两个链表对应的头节点传入到函数FindFirstCommonNode里面,用户得到的输入只有pHead1和pHead2。
方法一
解题思路:将两条链表分别压入两个栈中,然后循环比较两个栈的栈顶元素,同时记录上一位栈顶元素。
当遇到第一个不同的节点时,结束循环,上一位栈顶元素即是答案。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.Stack;
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
/*
算法思想:将两条链表分别压入两个栈中,然后循环比较两个栈的栈顶元素,同时记录上一位栈顶元素。
当遇到第一个不同的节点时,结束循环,上一位栈顶元素即是答案。
*/
Stack<ListNode> s1 = new Stack<ListNode>();
Stack<ListNode> s2 = new Stack<ListNode>();
while(pHead1 != null){
s1.push(pHead1);
pHead1 = pHead1.next;
}
while(pHead2 != null){
s2.push(pHead2);
pHead2 = pHead2.next;
}
ListNode head = null;
while((!s1.isEmpty())&&(!s2.isEmpty())){
if(s1.peek() == s2.peek()){ //如果栈顶元素一样,用head记录此时的栈顶元素,再pop
head = s1.pop();
s2.pop();
}
else //如果栈顶元素不一样,结束循环
break;
}
return head;
}
}