两个链表有公共节点,表示从某个节点之后所有的节点都相同(共享节点),即两个链表一起呈现Y型
- 暴力遍历
- 将两个链表倒置,然后遍历两个新链表,即相当于从原来的链表的尾部开始向前遍历,直到两个链表分叉的地方结束,只是此时遍历出来的是倒序的节点
- 最普遍的解法:先把较长的链表多余长度的部分遍历完,然后再从两个链表相同长度的节点位置开始同时遍历直到共享的位置(如下图)
图片来自博客C语言 寻找两个单链表的公共节点实现与原理
用c语言实现第三种方法:
/*
参数: 带头节点的两个链表的头指针,以及两个链表的长度
*/
void findCommon(pList head1, int len1, pList head2, int len2)
{
int dist = abs(len1 - len2);
//用min存储较小的长度
int min = len1 < len2 ? len1 : len2;
//用minCur指向较小长度的链表的第一个元素(头结点下一节点)
pList minCur = len1 < len2 ? head1->next : head2->next;
//用cur指向较长长度的链表的第一个元素
pList cur = len1 > len2 ? head1->next : head2->next;
//遍历较长链表的多余节点
for (int i = 0; i < dist; ++i)
{
cur = cur->next;
}
//从cur开始,两个链表遍历的长度相同,或者用while循环直到cur!=Null
for (int i = 0; i < min; ++i)
{
if (cur==minCur){
printf("开始输出:\n");
while(cur){
printf("%d,",cur->it);
cur=cur->next;
}
return;
}else{
cur=cur->next;
minCur=minCur->next;
}
}
}