数据结构——链表“焦点”(C语言版)

不是烧焦的焦
这里是交点的交!!

我们要求的问题是,判断两个链表是否是相交的,并且如果是相交的话,找出交点!!

两个链表的相对位置有以下六种,其中我们这里讨论的是不带环的链表相交!
这里写图片描述

显而易见
我们要判断两个不带环链表的相交很简单! 只需要看其尾结点是否一致,便可做出判断
这里写图片描述

对此,我们先首先构造一个相交的链表,再通过我们的代码进行判断!!

构造相交链表的代码:

PNode List1;
PNode List2;

SListInit(&List1);
SListInit(&List2);

PNodePushBack(&List1, 1);
PNodePushBack(&List1, 2);
PNodePushBack(&List1, 3);
PNodePushBack(&List1, 4);
PNodePushBack(&List1, 5);

PNodePushBack(&List2, 9);
PNodePushBack(&List2, 0);
PNodePushBack(&List2, 6);
PNodePushBack(&List2, 7);
PNodePushBack(&List2, 8);

PNode pCur = List2;
while (pCur->_pNext)
{
    pCur = pCur->_pNext;
}

pCur->_pNext = FindDataNode(List1, 4);
printSList(List1);
printSList(List2);

判断是否相交的代码:

// 判断两个单链表是否相交---链表不带环 
int IsSListCross(PNode pHead1, PNode pHead2)
{
    if (pHead1 == NULL || pHead2 == NULL)         //存在一个链表为空   即不相交 返回0
        return 0;

while (pHead1->_pNext)                                //遍历链表   找到尾结点
    pHead1 = pHead1->_pNext;
while (pHead2->_pNext)
    pHead2 = pHead2->_pNext;

if (pHead1 == pHead2)                         //若 两个链表有相同的尾结点  则相交  返回1
    return 1;
else
    return 0;                                 //否则不相交  返回0
}

测试结果:
这里写图片描述

那么我们如何求得他们的交点呢???

我很很容易知道 交点是 值为4和5 的两个结点
其实很简单

思路:
之前我们求过链表中间结点,倒数第K个结点等问题:https://blog.csdn.net/code_zx/article/details/80581825
这里的思路也是一样的,

首先:我们求出两条链表的长度
其次:我们将长的链表先走k步!(这里的k是两条链表的长度差值)
再次:我们将两个链表同时往后走
最后:当两个链表的结点一样时,我们便找到了第一个相交的结点
易知,该结点后的所有结点都是两个链表的交点

代码:

// 求两个单链表相交的交点---链表不带环 
PNode GetCorssNode(PNode pHead1, PNode pHead2)
{
    PNode pCorss = NULL;
    int s1 = ListSize(pHead1);
    int s2 = ListSize(pHead2);

if (s1 >= s2)
{
    int i = s1 - s2;
    while (i--)
        pHead1 = pHead1->_pNext;

    while (pHead1 != pHead2)
    {
        pHead1 = pHead1->_pNext;
        pHead2 = pHead2->_pNext;
    }
    pCorss = pHead1;
}
else
    pCorss = GetCorssNode(pHead2, pHead1);
return pCorss;

·}

测试结果:
这里写图片描述

最后:
链表相交的问题还有 带环链表的相交,关于这部分的解题方法,会陆续发出来!!!
谢谢!
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值