链表相交问题

判断两个链表是否相交,若相交,求交点。(假设链表不带环)

这里写图片描述
假设这就是两条相交的链表,交点为5,现给出两条链表的头结点plist1和plist2,求出交点:

首先判断两条链表是否相交

两条相交的链表只能是 V 字形状或者 Y 字形,所以遍历最后肯定是同一个节点,由此便可以得出两条链表是否相交,还是要注意特殊情况下的判断,保证代码的鲁棒性!

//判断两个链表是否相交,若相交,求交点。(假设链表不带环) 
int CheckCross(pList list1, pList list2)
{
    pNode end1 = NULL;
    pNode end2 = NULL;
    //任意一个为空指针就不可能相交
    if (list1 == NULL || list2 == NULL)
        return 0;
    end1 = list1;
    end2 = list2;

    while (end1->next != NULL)
        end1 = end1->next;

    while (end2->next != NULL)
        end2 = end2->next;

    return end1 == end2;
}

返回两条相交链表的交点

这个也不难,思路就是看两条链表谁更长,让较长的先走(长链表的长度-短链表的长度的绝对值)步,这样再同时开始走,直到地址相同的时候肯定就是交点!

//相交的话返回交点
pNode GetGrossNode(pList list1, pList list2)
{
    int len1 = 0;
    int len2 = 0; 
    //长度之差
    int gap = 0;

    pNode p1 = list1;
    pNode p2 = list2;

    //先求出两条链表的长度
    while (p1 != NULL)
    {
        len1++;
        p1 = p1->next;
    }
    while (p2 != NULL)
    {
        len2++;
        p2 = p2->next;
    }
    gap = abs(len1 - len2);

    //让较长的链表先走gap步
    if (len1 > len2){
        while (gap--)
            list1 = list1->next;
    }
    else
    {
        while (gap--)
            list2 = list2->next;
    }

    //两个链表同时开走,只要遇到地址一样的节点那么就是相交的点
    while (list1 != NULL)
    {
        list1 = list1->next;
        list2 = list2->next;
        if (list1 == list2)
            return list1;
    }
    return NULL;
}

其他情况

这里写图片描述

猜你喜欢

转载自blog.csdn.net/m0_38032942/article/details/81235104