2024王道408数据结构 P39 T23

2024王道408数据结构 P39 T23

思考过程

  1. 首先我们来理解题目的意思,题目要我们找两个单链表共同的部分,那我们要找的部分也就是我用红笔标记出来的这一部分但是两个链表有长有短,所以说我们要把长的链表的前面部分先给遍历完请添加图片描述
  2. 那为了先把长的L1链表的前面部分遍历完,我们先要
    • 求出两个链表的长度len1,len2
    • 求两个长度的差值的绝对值len = len1 - len2
    • 让长的L1链表先遍历len个,短的L2链表暂时不动
    • L1前面部分遍历完后两个链表同时开始遍历
    • 最后判断data值是否相等
  3. 明确了上面的信息之后我们就可以开始敲代码了,首先还是需要两个指针一个p1一个p2分别遍历L1和L2链表,struct node *p1 = L1->next, *p2 = L2->next;请添加图片描述
  4. 为了方便写一个length函数求两个链表的长度,这个很简单,只需要定义一个计数器count,定义一个指针p来遍历就可以,这里就不再多说,while (p) {count++, p = p->next;}
  5. 求出长度之后求出差值dist = abs(len1 - len2);判断两个链表是谁比较长,比较长的那一个链表就让他的指针先往后遍历dist个,if (len1 >= len2) while(dist--) p1=p1->next; else while (dist--) p2 = p2->next;现在两个指针就来到了如下图所示的位置请添加图片描述
  6. 接下来我们就可以判断如果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主@吸血小金鱼

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值