查找两条链表的第一个公共节点
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个可能有环链表的公共节点. 这样的话我们需要在多加一个快指针在第一条(或第二条)链表上面. 这样如果存在环的话我们需要先把环解开, 然后再用上述方法找到第一个公共节点.
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个可能有环链表的公共节点. 这样的话我们需要在多加一个快指针在第一条(或第二条)链表上面. 这样如果存在环的话我们需要先把环解开, 然后再用上述方法找到第一个公共节点.
相关文章推荐
- 由一道很简单的求两条链表的第一个公共节点的问题引发的思考
- 两条相交的单向链表,如何求他们的第一个公共节点
- 判断两个链表是否相交;查找两个链表的第一个公共节点;头插法建链表(补充)
- 两个链表的第一个公共节点
- 两个链表的第一个公共节点
- (LeetCode)两个链表的第一个公共节点
- 剑指off-求两个链表的第一个公共节点
- 剑指Offer学习总结-两个链表的第一个公共节点
- 求有环链表(循环链表的第一个公共节点)
- 两个链表相交以及第一个公共节点的问题
- Intersection of Two Linked Lists(两个链表的第一个公共节点)
- 程序:找出两个链表的第一个公共节点及c++中堆栈、队列的基本操作
- 两个链表的第一个公共节点
- 剑指offer37-两个链表的第一个公共节点
- 找到两个单向链表的第一个公共节点
- 【剑指offer系列】 两个链表的第一个公共节点___37
- 剑指offer系列之35:两个链表的第一个公共节点
- 两个链表的第一个公共节点
- 两个链表的第一个公共节点
- 输入两个链表,找出它们的第一个公共节点(值)