1.问题描述
输入两个链表,找出它们的第一个公共结点。
说明:应该是两个单向链表,成Y字型,不会成X型,也不会成环。
2.解决思路
链表只能从表头单向访问,可以利用栈的后进先出特性来实现,把两个链表压入栈再弹出来,但是那样需要两个辅助栈,如果两条链表的长度分别是m和n,则需要m+n个辅助栈空间,同时时间复杂度为O(m+n)。
使用两个指针:先遍历计算链表的长度,让长链表的指针先走| m-n|步。时间复杂度不变,空间复杂度为O(1)。
3.代码实现
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* head1, ListNode* head2) {
if(head1 == NULL || head2 == NULL) return NULL;
ListNode* node1 = head1;
ListNode* node2 = head2;
int len1 = 1;
int len2 = 1;
while(node1->next != NULL){
++len1;
node1 = node1->next;
}
while(node2->next != NULL){
++len2;
node2 = node2->next;
}
node1 = head1;
node2 = head2;
if(len1 > len2){
int k = len1 - len2;
for(int i=0; i < k; ++i )
node1 = node1->next;
}
else{
int k = len2 - len1;
for(int i=0; i < k; ++i )
node2 = node2->next;
}
while(node1 != node2){
node1 = node1->next;
node2 = node2->next;
}
return node1;
}
};