2024王道408数据结构 P39 T23
思考过程
- 首先我们来理解题目的意思,题目要我们找两个单链表共同的部分,那我们要找的部分也就是我用红笔标记出来的这一部分但是两个链表有长有短,所以说我们要把长的链表的前面部分先给遍历完。
- 那为了先把长的L1链表的前面部分遍历完,我们先要
- 求出两个链表的长度len1,len2
- 求两个长度的差值的绝对值len = len1 - len2
- 让长的L1链表先遍历len个,短的L2链表暂时不动
- L1前面部分遍历完后两个链表同时开始遍历
- 最后判断data值是否相等
- 明确了上面的信息之后我们就可以开始敲代码了,首先还是需要两个指针一个p1一个p2分别遍历L1和L2链表,
struct node *p1 = L1->next, *p2 = L2->next;
- 为了方便写一个length函数求两个链表的长度,这个很简单,只需要定义一个计数器count,定义一个指针p来遍历就可以,这里就不再多说,
while (p) {count++, p = p->next;}
- 求出长度之后求出差值
dist = abs(len1 - len2);
判断两个链表是谁比较长,比较长的那一个链表就让他的指针先往后遍历dist个,if (len1 >= len2) while(dist--) p1=p1->next; else while (dist--) p2 = p2->next;
现在两个指针就来到了如下图所示的位置 - 接下来我们就可以判断如果p1->data不等于p2->data的话我们就让两个指针同时向后移,如果等于就可以直接返回p1或者p2,
if (p1->data != p2->data) {p1=p1->next;p2=p2->next} else return p1;
这样这道题就算完成喽。
完整代码附上:
//
// Created by 黎圣 on 2023/7/28.
//
#include "iostream"
using namespace std;
typedef struct node
{
char data;//注意这里的data值是char,我在这里卡了好久😠
struct node *next;
} *linklist;
//题目举的例子
char a[7] = {'l','o','a','d','i','n','g'};
char b[5] = {'b','e','i','n','g'};
int n = 7;
int m = 5;
//创建链表L1,也就是loading
void CreateList1(linklist &L)
{
L = (linklist)malloc(sizeof(struct node));
struct node *s, *r = L;
for (int i = 0; i < n; i++)
{
s = (linklist)malloc(sizeof(struct node));
s->data = a[i];
r->next = s;
r = r->next;
}
r->next = NULL;
}
//创建链表L2,也就是being
void CreateList2(linklist &L)
{
L = (linklist)malloc(sizeof(struct node));
struct node *s, *r = L;
for (int i = 0; i < m; i++)
{
s = (linklist)malloc(sizeof(struct node));
s->data = b[i];
r->next = s;
r = r->next;
}
r->next = NULL;
}
//打印出来方便观察
void display(linklist L)
{
struct node *s = L->next;
while (s)
{
printf("%c ", s->data);
s = s->next;
}
printf("\n");
}
//求长度的函数
int length(linklist L)
{
int count = 0;
struct node *p = L->next;
while (p)
{
count++;
p = p->next;
}
return count;
}
//题目主代码
linklist first(linklist L1, linklist L2)
{
struct node *p1 = L1->next, *p2 = L2->next;
int len1 = length(L1);
int len2 = length(L2);
int dist = abs(len1 - len2);//abs求绝对值
if (len1 >= len2)
while (dist--)
p1 = p1->next;
else
while (dist--)
p2 = p2->next;
while (p1)
{
if (p1->data != p2->data)
{
p1 = p1->next;
p2 = p2->next;
}
else
return p1;
}
return p1;
}
int main()
{
linklist L1, L2;
CreateList1(L1);
CreateList2(L2);
display(L1);
display(L2);
linklist ans = first(L1, L2);
printf("%c", ans->data);
return 0;
}
ok搞定,最后感谢b站up主@吸血小金鱼