当前位置: 首页 > article >正文

【单链表算法实战】解锁数据结构核心谜题——相交链表

题目如下:

在这里插入图片描述

解题过程如下:

相交链表只可以在中间任意位置/头/尾结点相交,如下图:

在这里插入图片描述

一个next指针只能指向一块地址,所以不会出现这种情况:
在这里插入图片描述

在返回相交链表的起始结点之前先要判断两个链表是否相交,分析下列两种方法是否可行?

  1. 遍历两个链表,判断结点(地址)是否相同。如果像示例1一样,两个链表的长度不等,代码运行结果就是两个链表不会相交,这与事实恰恰相反。所以这个方法不可行:
    在这里插入图片描述

  2. 看两个链表的尾结点(地址)是否相同。参考相交链表的三种情况,尾结点相同那么两个链表就一定相交。

那么怎么返回相交链表的起始结点呢?

思路:求两个链表的长度,长链表先走长度差步,长短链表遍历比较结点的地址是否相同。

完整代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    //求两个链表的长度
    ListNode* pa = headA;
    ListNode* pb = headB;
    int sizeA = 0;
    int sizeB = 0;
    while (pa)
    {
        ++sizeA;
        pa = pa->next;
    }
    while (pb)
    {
        ++sizeB;
        pb = pb->next;
    }
    //长链表先走长度差(gap)步
    int gap = abs(sizeA - sizeB);
    ListNode* shortList = headA;
    ListNode* longList = headB;//假设B是长链表
    if (sizeA > sizeB)
    {
        shortList = headB;
        longList = headA;
    }
    while (gap--)
    {
        longList = longList->next;
    }
    //长短链表遍历结点的地址是否相同
    while (longList) //等同于shortList != NULL
    {
        if (longList == shortList)
            return longList;
        longList = longList->next;
        shortList = shortList->next;
    }
    return NULL;
}

abs()函数用于求绝对值:
在这里插入图片描述


http://www.kler.cn/a/519267.html

相关文章:

  • 解决使用Selenium时ChromeDriver版本不匹配问题
  • [b01lers2020]Life on Mars1
  • 计算机视觉:撕裂时空的视觉算法革命狂潮
  • 落地级分类模型训练框架搭建(1):resnet18/50和mobilenetv2在CIFAR10上测试结果
  • 高级java每日一道面试题-2025年01月24日-框架篇[SpringBoot篇]-如何理解 Spring Boot 中的 Starters(启动器) ?
  • three.js+WebGL踩坑经验合集(4.1):THREE.Line2的射线检测问题(注意本篇说的是Line2,同样也不是阈值方面的问题)
  • 多模态论文笔记——ViViT
  • OpenAI-Edge-TTS的使用
  • 深入解析Gradle项目发布配置:从构建到仓库部署
  • SAM 2运行笔记
  • 为AI聊天工具添加一个知识系统 之69 详细设计 之10 三种中台和时间度量 之2
  • 5.如何减少顶点数
  • 【elasticsearch】reindex 操作将索引的数据复制到另一个索引
  • 【2024年华为OD机试】 (A卷,200分)- 几何平均值最大子数组(JavaScriptJava PythonC/C++)
  • 《CPython Internals》阅读笔记:p356-p359
  • Spring 框架基础:IOC 与 AOP 原理剖析及面试要点
  • Spring Boot 无缝集成SpringAI的函数调用模块
  • android12源码中用第三方APK替换原生launcher
  • 半小时速通flume-flume正文学习
  • 【深入理解SpringCloud微服务】Sentinel源码解析——DegradeSlot熔断规则