`

如何判断两个单向链表是否有相交,并找出交点

阅读更多

 

题比较简单,单向链表有交点意思就是交点后的节点都是一样的了

 

NODE* FindNode(NODE* pHead1, NODE* pHead2)
{
     NODE* p1 = pHead1;
     NODE* p2 = pHead2;
    int i = 1, j = 1, k = 0, f = 0;

    if(pHead1 == NULL || pHead2 == NULL)
    {
        return NULL;
    }

    while(p1->next != NULL)
    {
         p1 = p1->next;
         i++;
    }

    while(p2->next != NULL)
    {
         p2 = p2->next;
         j++;
    }

    if(p1 != p2)
    {
        return NULL;
    }
    else
    {
         p1 = pHead1;                // 1
         p2 = pHead2;

         f = fabs(i-j) //求绝对值的函数
        if(i > j)                    // 2
        {
            for(k=0; k<f; k++)
            {
                 p1 = p1->next;
            }
            while(p1 != p2)
            {
                 p1 = p1->next;
                 p2 = p2->next;
            }
            return p1;
        }
        else
        {
            for(k=0; k<f; k++)
            {
                 p2 = p2->next;
            }
            while(p1 != p2)
            {
                 p1 = p1->next;
                 p2 = p2->next;
            }
            return p1;
        }
    }
}

1,在第一次遍历完链表后,进行第二次遍历,需要把指针再次初始化;看见网上一些人给的例子没有再次初始化显然是错误的;再调用NULL的next不死才怪!

2,小优化。循环和判断,把判断放在外面;如果把i和j大小判断放在里面的话就意味着循环多少次,判断就执行多少次;当然这样做的唯一不足就是代码多了点;还有for循环之前的对f的赋值,有的为了简便直接放在for语句里面,不过同样道理,放在for循环里面,就执行了n次的fabs;拿出来赋值,只赋值一次就OK。

分享到:
评论

相关推荐

    编程判断两个链表是否相交

    本篇文章将详细探讨如何判断两个单向链表是否相交的问题,以及相应的解决方案。 #### 问题背景 在实际应用中,尤其是在大型系统开发过程中,可能会遇到两个链表相交的情况。例如,当两个链表共享部分节点时,如果不...

    编程判断两个链表是否相交.pdf

    分析与解法 这样的一个问题,也许我们平时很少考虑。但在一个大的系统中,如果出现两个链表相 交的情况,而且释放了其中一个链表的...的两个链表,我们希望在释放一个链表之前知道是否有其他链表跟当前这个链表相交。

    将一个单向链表反向连接

    将一个单向链表反向连接

    判断链表是否相交的几种算法1

    链表是数据结构中常见的一种线性...总之,判断链表是否相交的问题可以通过多种算法来解决,每种方法都有其优缺点。在实际应用中,应根据具体需求,如时间复杂度、空间复杂度和是否允许修改链表结构等,选择合适的算法。

    C#单向链表的实现

    单向链表是由一系列节点组成,每个节点包含两个部分:数据域和指针域。数据域存储实际的数据,而指针域则指向下一个节点的地址。与数组不同,链表中的元素并不在内存中连续存放,这使得链表在插入和删除操作上具有较...

    单向链表 代码架构

    单向链表的每个节点包含两部分:数据和指向下一个节点的引用。 在给定的“单向链表 代码架构”中,我们可以期待找到以下几个关键知识点: 1. **链表节点结构**:通常,链表节点由数据域(用于存储数据)和指针域...

    单向链表源代码

    单向链表由一系列节点组成,每个节点有两个部分:数据域,用于存储数据;指针域,存储指向下一个节点的引用。链表的头节点是链表的第一个元素,而尾节点的指针域为null,表示链表的结束。由于链表中的节点没有顺序...

    单向链表实验报告(数据结构)

    2. 遍历链表:遍历整个链表,打印出所有元素,检查链表是否正确构建。 3. 链表反转:不使用额外的空间,仅通过改变节点间的连接关系实现链表的反转。 4. 删除偶数节点:遍历链表,删除所有数值为偶数的节点。 5. 非...

    单向链表类模板_单向链表类模板_fastchq_

    5. **其他操作**:还可以添加其他功能,如搜索元素、合并两个链表、反转链表等。 例如,`insert`方法的实现可能如下: ```cpp template void LinkedList&lt;T&gt;::insert(T value) { ListNode* newNode = new ListNode...

    04.单向链表以及单向链表的应用.ppt

    04.单向链表以及单向链表的应用.ppt

    实验二 单向链表的有关操作.cpp

    1.随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。 2.遍历单向链表。 3.把单向链表中元素逆置(不允许申请新的结点空间)...利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。

    Java 单向链表 插入与删除节点

    这是一个单向链表,它具有插入与删除节点的功能。Entry类实现了链表的各节点。

    单向链表多种功能实现

    合并两个已排序的单向链表,通常采用迭代方法,比较两个链表的头节点,将较小的一个插入结果链表,然后移动较小链表的指针,直到其中一个链表为空。最后,将非空链表的剩余部分连接到结果链表。 6. **查找回路** ...

    数据结构 单向链表 双向链表 源程序

    插入和删除操作在双向链表中也更为复杂,因为需要同时更新前后两个节点的指针。然而,由于这种双向性,某些操作(如查找某个节点的前一个或后一个节点)可能会更快。 源程序,通常是指用高级编程语言编写的未经过...

    C语言实现的一个单向链表逆转

    单向链表是一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表逆转是计算机科学中常见的操作,它将链表中的元素顺序颠倒,使得原链表的最后一个元素成为新链表的第一个元素,而...

    1.3.9 如何判断两个链表是否相交.md

    1.3.9 如何判断两个链表是否相交

    C语言自学链表,单向链表,双向链表,适合新手学习。

    - **插入节点**:在链表中的某个位置插入新节点,需要修改前后两个节点的指针以保持链表的连通性。 - **删除节点**:找到待删除节点的前一个节点,修改其指针以指向待删除节点的后继节点,然后释放待删除节点的...

    C语言实现的单向链表和双向链表

    单向链表是一种线性数据结构,其中的每个元素(节点)包含两个部分:数据和指向下一个节点的指针。由于节点只能向前移动,因此称为单向链表。单向链表的基本操作包括插入、删除和遍历。 1. **结构定义**: 在C语言...

    flash as3.0 实现的单向链表

    一个单向链表由一系列节点组成,每个节点包含两个主要部分:数据存储部分和指向下一个节点的引用。链表的第一个节点称为头节点,最后一个节点的引用通常为null,表示链表的末尾。 首先,我们需要创建一个Node类,它...

Global site tag (gtag.js) - Google Analytics