一【题目类别】
二【题目来源】
- 本题目选自王道2023考研计算机数据结构复习指导40页中二、综合应用题之08题
三【题目描述】
四【解题思路】
- 首先这个题目描述不是很清楚哈,应该是第一个公共结点,或者题目应该说明只有一个公共结点,否则的话有很多公共结点代码就完全不一样了。整体代码的思路还是比较清晰的,个人感觉类似快慢指针的思想,找出两个单链表的长度差,然后同步两个单链表的长度,最后再同步向前查找,就可以找到第一个公共结点了
五【时间频度】
- 时间复杂度:
O
(
m
+
n
)
O(m+n)
O(m+n),其中
m
、
n
m、n
m、n分别为两个单链表长度
- 空间复杂度:
O
(
1
)
O(1)
O(1)
六【代码实现】
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode* next;
}Node, *Link;
int Length(Link link)
{
int len = 0;
Node* p = link->next;
while (p != NULL)
{
len++;
p = p->next;
}
return len;
}
Link Search_Link_Common(Link L1, Link L2)
{
int len1 = Length(L1);
int len2 = Length(L2);
int dist;
Link shortLink, longLink;
if (len1 > len2)
{
shortLink = L2->next;
longLink = L1->next;
dist = len1 - len2;
}
else
{
shortLink = L1->next;
longLink = L2->next;
dist = len2 - len1;
}
while (dist--)
{
longLink = longLink->next;
}
while (longLink != NULL)
{
if (shortLink == longLink)
{
return longLink;
}
else
{
longLink = longLink->next;
shortLink = shortLink->next;
}
}
return NULL;
}
int main()
{
Link link1 = (Link)malloc(sizeof(Node));
link1->next = NULL;
Node* p1 = link1;
int len1;
printf("请输入单链表L1的长度:");
scanf("%d", &len1);
printf("请输入单链表L1的元素:");
for (int i = 0; i < len1; i++)
{
int x;
scanf("%d", &x);
Node* temp = (Node*)malloc(sizeof(Node));
temp->data = x;
temp->next = NULL;
p1->next = temp;
p1 = temp;
}
p1 = link1;
for (int i = 0; i < 3; i++)
{
p1 = p1->next;
}
Link link2 = (Link)malloc(sizeof(Node));
link2->next = NULL;
Node* p2 = link2;
int len2;
printf("请输入单链表L2的长度(只需要输入第一个公共结点前面的长度即可):");
scanf("%d", &len2);
printf("请输入单链表L2的元素(只需要输入第一个公共结点前面的元素即可):");
for (int i = 0; i < len2; i++)
{
int x;
scanf("%d", &x);
Node* temp = (Node*)malloc(sizeof(Node));
temp->data = x;
temp->next = NULL;
p2->next = temp;
p2 = temp;
}
p2->next = p1;
Link res = Search_Link_Common(link1, link2);
printf("第一个公共结点为:%d",res->data);
printf("\n");
system("pause");
return 0;
}
七【程序测试】
![在这里插入图片描述](https://img-blog.csdnimg.cn/24646b5287ae4a5e881a653c06081fc8.png)