1.题目描述:
输入两个链表,找出它们的第一个公共结点。
2.解题思路
方法一:将两个链表拼接起来。 将两个链表进行拼接,一个链表1在前链表2在后,另一个链表2在前链表1在后,则合成的两个链表一样长,然后同时遍历两个链表,就可以找到公共结点,时间复杂度同样为O(m+n)。
方法二:借助辅助栈。我们可以把两个链表的结点依次压入到两个辅助栈中,这样两个链表的尾结点就位于两个栈的栈顶,接下来比较两个栈顶的结点是否相同。如果相同,则把栈顶弹出继续比较下一个,直到找到最后一个相同的结点。此方法也很直观,时间复杂度为O(m+n),但使用了O(m+n)的空间,相当于用空间换区了时间效率的提升。
3.编程实现(Java):
public class FindFirstCommonNode_21 {
//方法一
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if (pHead1 == null || pHead2 == null)
return null;
ListNode head1 = pHead1;
ListNode head2 = pHead2;
while (head1 != head2) {
head1 = head1 == null ? pHead2 : head1.next;
head2 = head2 == null ? pHead1 : head2.next;
}
return head1;
}
//方法二
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if (pHead1 == null || pHead2 == null)
return null;
Stack<ListNode> stack1 = new Stack<ListNode>();
Stack<ListNode> stack2 = new Stack<ListNode>();
while(pHead1!=null){
stack1.push(pHead1);
pHead1 = pHead1.next;
}
while(pHead2!=null){
stack2.push(pHead2);
pHead2 = pHead2.next;
}
ListNode result = null;
while( (stack1.size() != 0) && (stack2.size() != 0)
&& (stack1.peek() == stack2.peek())){
result = stack1.peek();
stack1.pop();
stack2.pop();
}
return result;
}
}