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

力扣HOT100之链表:160. 相交链表


这道题已经刷过三四回了,看到这道题就直接秒了,纯数学技巧,我们直接用两个指针变量分别保存headAheadB指向的地址,然后直接在一个while循环中分别遍历两个链表,当遍历到A链表的末尾时(headA == nullptr),立刻将headA赋值为B链表的首元素地址,继续遍历,同理,当遍历到B链表的末尾时,直接将headB赋值为A链表的首元素地址,并继续遍历,当headA==headB时退出while循环,然后直接返回headA即可。
上述的while循环一定会退出,而不会无限循环下去,当while循环退出的时候,headA和headB都指向相同的节点,这是必然的,下面简单用两个例子来说明:

上面是两个链表相交的情况,下面是两条链表不相交(可以认为是广义的相交,因为两个链表的末尾都指向空节点)的情况,headA的遍历路径用黑色数字表示,headB的遍历路径用红色数字表示,可以看出,在上面的例子中,总共经过了10步,headAheadB共同指向了C1节点,这就是两条链表的交点。在下面的例子中,总共经过了9步,headAheadB都指向了两条链表的“交点”nullptr,然后直接将headAheadB返回即可,如果两条链表相交,那么返回的就是他们真正的交点,如果两个链表没有相交,返回的就是空指针,所以代码写出来特别简洁。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* A = headA;
        ListNode* B = headB;
        while(headA != headB){
            headA = headA ? headA -> next : B;
            headB = headB ? headB -> next : A;
        }
        return headA;
    }
};
http://www.dtcms.com/a/108550.html

相关文章:

  • MINIQMT学习课程Day1
  • 【操作系统】LinuxRT-Thread查看内存分布的方法
  • 06_docker 网络类型
  • 蓝桥杯 web 学海无涯(axios、ecahrts)版本二
  • tomcat使用笔记、启动失败但是未打印日志
  • ue5 学习笔记 FPS游戏制作35 GameMode与GameInstance
  • 零基础玩转深度神经网络大模型:从Hello World到AI炼金术-详解版(含:Conda 全面使用指南)
  • MySQL 管理
  • 论文阅读9——更严格的汽车排放标准对气候、健康、农业和经济的影响
  • Redis 慢查询
  • php 扩展库官网
  • 小程序中的网络请求
  • springcouldalibaba5大组件
  • leetcode热题100(2)
  • 在Linux系统上深入安装与配置Redis:从基础到高级的全方位指南
  • LeetCode BFS解决最短路问题
  • 深入浅出:Spring Bean 的初始化流程详解
  • [力扣每日一练]关于特定字符串的匹配
  • Flutter 插件 百度地图 Android插件演示
  • 配置Next.js环境 使用vscode
  • 多元守护,构筑健康生活
  • ClickHouse与Doris对比:数据处理领域的“华山论剑”
  • 制作cass高程点块定义——cad c#二次开发
  • 在QGIS中将矢量数据导出为JSON
  • 运营商在网状态查询API接口如何对接?
  • 【Axure高保真原型】动态柱状图
  • Redis中set数据类型的内部编码及使用场景
  • 5、vim编辑和shell编程【超详细】
  • TypeScript基础教程
  • 第二章:chrony服务器