您的位置:首页 > 其它

查找两条链表的第一个公共节点

2010-07-12 23:23 295 查看
假设两条链表有公共节点Node, 那么从Node往后的节点必定都是公共节点. 也就是这两个链表成"Y"的形状. 那么两个链表的长度差只会出现在Node之前.

Node *find_first_common(Node *head1, Node *head2) {
int m = 0;
int n = 0;
Node *p1 = head1;
Node *p2 = head2;
int i;
while(p1) {
m++;
p1 = p1->next;
}

while(p2) {
n++;
p2 = p2->next;
}
p1 = head1;
p2 = head2;
if(m>n) {
for(i=0;i<m-n;i++) { p1 = p1->next; }
} else {
for(i=0;i<n-m;i++) { p2 = p2->next; }
}
while(p1!=p2) {
p1 = p1->next;
p2 = p2->next;
}
return p1;
}

扩展:

这个问题可以和(1)中的有环链表问题混合起来, 也就是说找到2个可能有环链表的公共节点. 这样的话我们需要在多加一个快指针在第一条(或第二条)链表上面. 这样如果存在环的话我们需要先把环解开, 然后再用上述方法找到第一个公共节点.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: