数据结构| |链表面试题之判断两个链表是否相交,若相交求交点

对于两个链表相交,首先要搞清楚,两个链表怎样就相交了。
对于两个链表相交,如果两个链表是X形状的这就不是相交的,这是相遇,只是在某一个位置进行相遇了而已,只有是Y这种形状的才是相交的。
接下来就思考一下,如何来判断两个链表相交了呢。首先我们来看一下两个链表相交的样子。
两个链表相交的样子
这就是两个链表相交的样子。可以看出当两个链表相交的时候,最后一个结点是一样的,所以只需要对两个链表都进行遍历到最后一个结点,只需要判断最后一个结点是否相等即可这样就可以看出两个链表是否相交了。
代码实现:

//判断两个链表是否相交,相交返回true,不相交返回false
bool CheckMeet(pList pList1, pList pList2)
{
    bool flag = true;
    while (pList1->next != NULL)
    {
        pList1 = pList1->next;
    }
    while (pList2->next != NULL)
    {
        pList2 = pList2->next;
    }
    if (pList1 == pList2)
    {
        return true;
    }
    else
    {
        return false;
    }
}

如果两个链表相交的话求其交点。
思路:由于两个链表是不一样长度的,所以可以先求出两个链表的长度,然后用长度长的链表减去长度短的链表,得出一个长度k,然后先让链表长度长的链表先走k步,然后两个链表在一起走,只要链表的指针相等,那么这个时候指针指向的结点就是两个链表的交点了。
话不多少,啥都不如看图直观,来看图:
相遇结点

代码:

//求两个链表的相遇结点
pNode GetMeet(pList pList1, pList pList2)
{
    int len1 = GetLinkListLength(pList1);
    int len2 = GetLinkListLength(pList2);
    int d = len1 - len2 > 0 ? len1 - len2 : len2 - len1;
    if (len1 > len2)
    {
        while (d--)
        {
            pList1 = pList1->next;
        }
    }
    else
    {
        while (d--)
        {
            pList2 = pList2->next;
        }
    }
    while (pList1 != pList2)
    {
        pList1 = pList1->next;
        pList2 = pList2->next;
    }
    return pList1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值