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

【数据结构】_链表经典算法OJ:相交链表

目录

1.  题目链接及描述

2.  解题思路

2.1 思路1:一个链表把另外一个链表的结点逐个轮一遍

2.2 思路2:截断长链表,从距离交点结点前等距处开始同时遍历(本题解法)

3. 程序

关于解题程序的细节:

3.1 假设法的应用:

3.2 关于链表长度的计算


1.  题目链接及描述

题目链接:160. 相交链表 - 力扣(LeetCode)

题目描述:

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:


题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。

2.  解题思路

拆解题目要求:1、判断是否相交;2、若相交则找出第一个交点;

判断两个单链表是否相交:判断两个链表的尾指针是否相等,相等则相交,不等则不相交

注:1、本题不可逆置:否则在交点结点处存在两个next指针域,;

一个结点不允许存在两个next指针域;

2、判断尾指针相等与否需要用地址判断,不能用val值判断

2.1 思路1:一个链表把另外一个链表的结点逐个轮一遍

为两个链表分别创建结构体指针curNodeA和curNodeB,用第二个链表的每一个结点依次把第一个链表的所有结点都比一遍,直至交点结点处会相等;

时间复杂度O(N^2);

注:两个指针不可同时走,若相交结点前两个链表长度不同,则会导致即使相交也被判定为不相交的情况;

2.2 思路2:截断长链表,从距离交点结点前等距处开始同时遍历(本题解法)

分别计算两个链表的长度,若长度相等则直接从第一个结点处开始同时遍历并依次对比;

长度不等则截断长链表,从与短链表第一个结点到交点结点前处的结点开始同时遍历并依次对比;

时间复杂度O(N);

3. 程序

/**
 * 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* curNodeA=headA,*curNodeB=headB;
    // 分别计算两个链表长度
    int lenA=1,lenB=1;
    while(curNodeA->next){
        curNodeA=curNodeA->next;
        lenA++;
    }
    while(curNodeB->next){
        curNodeB=curNodeB->next;
        lenB++;
    }
    // 两个链表直至遍历到尾结点,指针都不等:两个链表不相等;
    if(curNodeA != curNodeB){
        return NULL;
    }
    // 令长链表的遍历指针先走差值步,再同时遍历,第一个相等就是交点
    int gap=abs(lenA-lenB);
    // 假设法:假设A长B短
    ListNode* longList=headA,*shortList=headB;
    // 若假设错误则修正
    if(lenB>lenA){
        longList=headB;
        shortList=headA;
    }
    while(gap--){
        longList=longList->next;
    }
    while(longList != shortList){
        shortList=shortList->next;
        longList=longList->next;
    }
    return shortList;
}

关于解题程序的细节:

3.1 假设法的应用:

当算得两个链表长度后,若链表长度不同,则需要截断长链表。但由于长短链表到底对应A和B哪个链表未知,若采用if(lenA>lenB)和if(lenB>lenA)两大分支则会造成代码的一定重复冗余,可采用假设法:

定义两个结构体变量longList和shortList分别指向长链表和短链表:

先假设A长B短,则将A赋值给LongList,B赋值给shortList。

若假设错误再修正:若lenB>lenA,再将B赋值给LongList,A赋值给shortList;

3.2 关于链表长度的计算

由于需定位到两个链表的尾结点,故循环判断条件应为curNodeX->next而非curNodeX,但当遍历至尾结点时不进入循环,如果将链表长度变量lenX初始值设为0,就会导致链表长度计算少算了尾结点,故而在设定链表长度变量lenX时,将其初始值均设为1;

但其实两个链表的长度即使少算了1,也不会造成影响:链表长度仅用于计算长短链表的差值。


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

相关文章:

  • [EAI-023] FAST,机器人动作专用的Tokenizer,提高VLA模型的能力和训练效率
  • LeGO LOAM坐标系问题的自我思考
  • Janus-Pro 论文解读:DeepSeek 如何重塑多模态技术格局
  • 动态规划DP 背包问题 完全背包问题(题目分析+C++完整代码)
  • ROS-IMU
  • 【自学笔记】Web前端的重点知识点-持续更新
  • linux中统计文件中特定单词或字符串的出现次数
  • CMake项目编译与开源项目目录结构
  • 面试常考题目——状态码总结
  • 96,【4】 buuctf web [BJDCTF2020]EzPHP
  • JavaFX - 事件处理
  • Mac上的虚拟化软件推荐
  • Go 中 defer 的机制
  • 基于开源AI智能名片2 + 1链动模式S2B2C商城小程序源码在抖音招商加盟中的应用与创新
  • web前端13--动画
  • 129.求根节点到叶节点数字之和(遍历思想)
  • 面试题:React实现鼠标托转文字绕原点旋转
  • DeepSeek是什么?横空出世意味着什么?
  • K8s介绍代理外部服务的svc几种方式
  • 力扣 215. 数组中的第K个最大元素
  • AWS EMR上的Spark日志实时搜索关键指标网页呈现的设计和实现
  • 测压表压力表计量表针头针尾检测数据集VOC+YOLO格式4862张4类别
  • 使用MATLAB进行雷达数据采集可视化
  • MySQL的覆盖索引
  • Games104——网络游戏的架构基础
  • Eigen::Tensor使用帮助