C语言编程实战:每日一题:相交链表

欢迎来到 s a y − f a l l 的文章 欢迎来到say-fall的文章 欢迎来到sayfall的文章

在这里插入图片描述


🌈这里是say-fall分享,感兴趣欢迎三连与评论区留言
🔥专栏: 《C语言从零开始到精通》 《C语言编程实战》 《数据结构与算法》 《小游戏与项目》
💪格言:做好你自己,你才能吸引更多人,并与他们共赢,这才是你最好的成长方式。


文章目录


题目:相交链表

  1. 流程图
开始
初始化指针pcura=headA, pcurb=headB
初始化长度lena=1, lenb=1
遍历链表A,计算长度lena
(pcura=pcura->next, lena++)
遍历链表B,计算长度lenb
(pcurb=pcurb->next, lenb++)
pcurb == pcura?
(尾节点是否相同)
返回NULL
(无交点)
lena > lenb?
longNode=headA, stortNode=headB
len=lena-lenb
longNode=headB, stortNode=headA
len=lenb-lena
longNode先走len步
(while(len--) longNode=longNode->next)
longNode == stortNode?
(当前节点是否相同)
返回longNode
(找到交点)
longNode不为空?
longNode=longNode->next
stortNode=stortNode->next
结束
  1. 具体步骤
步骤3: 同步遍历找交点
步骤2: 对齐起点
步骤1: 计算长度
longNode: 2→3→4
stortNode: 6→7→4
找到交点4,返回
链表A更长,先走1步
longNode从1→2
链表B起点不变
stortNode=6
链表A: 1->2->3->4->5
lena=5
链表B: 6->7->4->5
lenb=4
尾节点都是5,说明有交点
  1. 假设的链表图
链表B
链表A
7
6
5
4
3
2
1
交点在这里
  • 代码:

typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    ListNode* pcura = headA;
    ListNode* pcurb = headB;
    int lena = 1;
    int lenb = 1;
    while(pcura->next)
    {
        pcura = pcura->next;
        lena++;
    }
    while(pcurb->next)
    {
        pcurb = pcurb->next;
        lenb++; 
    }
    
    //没有相同尾节点,返回NULL
    if(pcurb != pcura)
    {
        return NULL;
    }

    //长的走差距步
    ListNode* longNode = NULL;
    ListNode* stortNode = NULL;
    int len = 0;
    if(lena>lenb)
    {
        longNode = headA;
        stortNode = headB;
        len = lena - lenb;
    }
    else
    {
        longNode = headB;
        stortNode = headA;
        len = lenb - lena;
    }
    while(len--)
    {
        longNode = longNode->next;
    }
    while(longNode)
    {
        if(longNode == stortNode)
        {
            return longNode;
        }
        longNode = longNode->next;
        stortNode = stortNode->next;
    }
    return NULL;
}

  • 本节完…
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值