leetcode160–相交链表(最优解/双指针)

2023-11-05

今天做的三道题比较简单~

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
在这里插入图片描述

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。
在这里插入图片描述

这道题注意思路,尽量简洁代码,对照官方答案,是我不配了……
先附上不优雅的代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *s = (struct ListNode *)malloc(sizeof(struct ListNode)*1);
    struct ListNode * a, * b,* a_x,* b_x;
    a = headA;
    b = headB;
    int len = 0;
    int flag = 1;
    while(a != NULL && b != NULL)
    {
        a = a->next;
        b = b->next;
    }
    while(a!= NULL)
    {
        len++;
        flag = 1;
        a = a->next;
    }
    while(b!= NULL)
    {
        len++;
        flag = 0;
        b = b->next;
    }
    a_x = headA;
    b_x = headB;
    while(len > 0)
    {
        if(flag == 0)
        {
            b_x  = b_x->next;
        }
        else
        {
            a_x = a_x->next;
        }
        len--;
    }
    while(a_x != NULL)
    {
        if(a_x == b_x)
        {
            return a_x;
        }
        else
        {
            a_x = a_x -> next;
            b_x = b_x -> next;
        }
    }
    return NULL;
}

优雅代码在这里
思路:就是两个指针一个指a一个指b,a走完了重新指到b,b走完了指到a。如果不相交,那两个指针就是把两个链表都走了一遍,最后都指向空。如果相交,那交的那一部分长度相同,第二次在相交的时候一定能碰到。因为最终两指针走的一样远。

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (headA == nullptr || headB == nullptr) {
            return nullptr;
        }
        ListNode *pA = headA, *pB = headB;
        while (pA != pB) {
            pA = pA == nullptr ? headB : pA->next;
            pB = pB == nullptr ? headA : pB->next;
        }
        return pA;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/solution/xiang-jiao-lian-biao-by-leetcode-solutio-a8jn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

虽然官方代码简洁 我还是觉得我的好

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode160–相交链表(最优解/双指针) 的相关文章

  • 排序算法总结—时间复杂度O(n^2)—冒泡/插入/选择小记

    排序算法总结 时间复杂度O n 2 冒泡 插入 选择小记 冒泡排序 最基础的排序 一层一层将最大值或最小值放到该去的位置 适用于顺序存储和链表存储 时间复杂度 O n 2 空间复杂度 O 1 稳定的排序算法 产生的有序子序列全局有序 每次有
  • leetcode线程题1116——打印零与奇偶数

    直接考虑信号量解决问题 输出完奇数偶数 释放输出0所需的信号量 对于本题没有想到的地方是调用过程 原代码编写的没有自己加入for循环 以为三个线程会不停被调用 一直不过 只输出 01 就结束了 根本没有循环起来 include
  • 排序算法总结—时间复杂度O(n)—基数排序/计数排序小记

    排序算法总结 时间复杂度O n 基数排序 基数排序 分为最高位优先和最低位优先的算法 找到最大值max 求出max的位数 在max位数max length进行循环max length趟 对于每一位进行排序 对于一个数字要会从低位一位一位取值
  • leetcode150–逆波兰表达式求值(栈/后缀表达式)

    根据 逆波兰表示法 求表达式的值 有效的算符包括 每个运算对象可以是整数 也可以是另一个逆波兰表达式 说明 整数除法只保留整数部分 给定逆波兰表达式总是有效的 换句话说 表达式总会得出有效数值且不存在除数为 0 的情况 示例 输入 toke
  • leetcode99-恢复二叉搜索树(两个空间复杂度的解法)

    恢复二叉搜索树 题目 给你二叉搜索树的根节点 root 该树中的 恰好 两个节点的值被错误地交换 请在不改变其结构的情况下 恢复这棵树 示例 思路 嘶 递归递了加一起得两个点 笔试的题是 交换了若干个相邻结点的 恢复成一颗二叉搜索树 估计就
  • 【刷题版】掌握算法的一揽子计划——深度优先搜索和回溯

    文章目录 深搜和回溯总结 基本概念 常见例题 自然数的拆分 排列型枚举 全排列 I 全排列 II 组合型枚举 组合 I 组合 II N皇后问题 一些简单的树和图上的问题 二叉树的遍历 二叉树的所有路径 岛屿的最大面积 参考资料 深搜和回溯总
  • leetcode905–按奇偶排序数组(经典/原地排序)

    经典题目 给定一个非负整数数组 A 返回一个数组 在该数组中 A 的所有偶数元素之后跟着所有奇数元素 你可以返回满足此条件的任何数组作为答案 主要要掌握最优解 这道题很简单 类快排 你不是真正的快排 Note The returned ar
  • LeetCode动态规划—跳跃游戏从跳到头到跳最少下跳到头(45、55)

    跳跃游戏 跳跃游戏 跳跃游戏 跳跃游戏 一个下标对应的值为3 那证明这个位置可以跳到前后3个位置的下标处 3均可达 如果依次遍历完这个数组 有下标在跳跃过程中最远位置仍然不可达 即证明无法到达最后一个位置 可以对每一个能作为 起跳点 的格子
  • leetcode160–相交链表(最优解/双指针)

    今天做的三道题比较简单 给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点 如果两个链表不存在相交节点 返回 null 题目数据 保证 整个链式结构中不存在环 注意 函数返回结果后 链表必须 保持其原
  • LeetCode1477-找两个和为目标值且不重叠的子数组

    给你一个整数数组 arr 和一个整数值 target 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target 可能会有多种方案 请你返回满足要求的两个子数组长度和的 最小值 请返回满足要求的最小长度和 如果无法找到这样的
  • Leetcode53/152—最大子数组和/最大子数组乘积(状态转移方程/不熟)

    53 最大子数组和 给你一个整数数组 nums 请你找出一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 子数组 是数组中的一个连续部分 思路 aaaaa 我老不会这个题 动态规划的是首先对数组进行遍历 当前最大连续子序列和
  • 剑指 Offer 28. 对称的二叉树(递归/并且或者要考虑好)

    orz 没有思路 有了思路还是错的 递归 可以仿照归并排序 我这么觉得 两边判断 如果不是当我没说 递归停止的条件是什么 结束条件 左节点和右节点都为空 gt 倒底了都长得一样 gt true 左节点为空的时候右节点不为空 或反之 gt 长
  • leetcode剑指offer11—旋转数组的最小值(二分/边界值)

    把一个数组最开始的若干个元素搬到数组的末尾 我们称之为数组的旋转 给你一个可能存在 重复 元素值的数组 numbers 它原来是一个升序排列的数组 并按上述情形进行了一次旋转 请返回旋转数组的最小元素 例如 数组 3 4 5 1 2 为 1
  • 【刷题版】掌握算法的一揽子计划——动态规划总结

    动态规划是一种通过将原问题分解为相对简单的子问题来求解 然后将子问题的解存储起来避免之后重复计算 并最终将子问题组合成原问题的解决方法 动态规划并不算是一种具体的算法 更应该被认为是一种解决问题的思想 动态规划通常适用于具有重叠子问题和最优
  • 贼全面的计算机考研数据结构算法题集合(408+自命题均可)

    文章目录 Code 数组 合并排序的数组 约瑟夫环问题 高效解法 栈 栈实现队列 最小栈 逆波兰表达式求值 队列 设计循环队列 链表 删除链表节点 删除链表中间节点 删除链表的倒数第n个节点 删除链表中的重复元素 相交链表 链表中环的入口点
  • LeetCode二维数组例题(原地旋转和对角线遍历)-c语言

    二维数组例题 二维数组 矩阵旋转 原地旋转 对角线遍历 二维数组 矩阵旋转 原地旋转 方法一 四个角是一个循环 引申到四个块是循环 n为偶数时 枚举n2 4个位置 n为奇数时 枚举 n2 1 4个位置 void rotate int mat
  • leetcode236—二叉树的最近公共祖先(递归/深搜/理解)

    给定一个二叉树 找到该树中两个指定节点的最近公共祖先 百度百科中 最近公共祖先的定义为 对于有根树 T 的两个节点 p q 最近公共祖先表示为一个节点 x 满足 x 是 p q 的祖先且 x 的深度尽可能大 一个节点也可以是它自己的祖先 深
  • leetcode排序算法总结—时间复杂度o(nlogn)-希尔/堆排/快排/归并小记

    排序算法总结 时间复杂度O nlogn 希尔 堆排序 快排 归并 希尔排序 有一段间隔的排序 可以逐个子表进行排序 然 例如王道 都给出便于计算机进行连续访问的程序算法 即依次按元素比较不同子表进行子表的调整 时间复杂度O n 1 3 最坏
  • 通过哲学家进餐问题学习线程间协作(代码实现以leetcode1226为例)

    哲学家进餐问题 代码实现以leetcode1226为例 问题场景 解决思路 解决死锁问题 代码实现 c go 代码实现以leetcode1226为例 提到多线程和锁解决问题 就想到了os中哲学家进餐问题 问题场景 回想该问题产生场景 五个哲
  • 结构体排序问题

    题目如下 刚刚看到这道题的时候一点点思路都没有 连题目都没读懂 include

随机推荐

  • win操作iOS UI自动化(tidevice+appium)

    1 安装 tidevice 使用命令 pip install tidevice 2 使用数据线连接手机 打出命令 tidevice list查看连接状态和udid 若有信息返回则连上 3 输入启动命令 启动wda包 tidevice u 设
  • Java链表-合并两个有序链表

    如何将两个有序链表合成一个新的有序链表 基本思想 定义一个新链表 定义一个新链表的指针tempNode 当合并的两个链表的头节点指针都不指向空时 比较两个链表节点的值 找到里面较小的值的地址 让新链表的指针tempNode下一个节点指向该最
  • 数据分析基础目录

    自从大数据技术火热之后 现在数据分析也火热了 至少我就有两个女同事转数据分析失败哈 不是我不帮她们 实在是帮不动 哈哈 这两个人都是英语专业的 一个是文学学士 一个是文学硕士 专业跨得太大了 但是我想说我转数据分析肯定会成功的 不因为别的
  • gitlab ci 使用

    gitlab ce与gitlab runner使用 采用docker方式运行gitlab ce 运行两个gitlab runner 一个运行在容器中 另一个安装在宿主机上 运行gitlab ce和gitlab runner容器 下载镜像 d
  • 【统计学习方法-李航-笔记总结】二、感知机(感知机的原始形式与对偶形式)

    本文是李航老师 统计学习方法 第二章的笔记 欢迎大佬巨佬们交流 主要包括以下几部分 1 感知机模型 2 感知机策略 3 感知机算法 1 感知机模型 感知机是二分类的线性分类模型 其输入为实例的特征向量 输出为实例的类别 取 1和 1两个值
  • 用OpenPose做一个运动量测量器

    代码 https github com B C WANG AI Apps tree master openpose app MotionMeasure 通过openpose获得肢体关键点的位置信息 利用脖子位置作为中心点求得相对位置 然后用
  • Windows MYSQL跳过密码登录以及密码修改

    MYSQL跳过密码登录以及密码修改 1 以管理员身份打开命令行 输入命令 net stop mysql 如果不是管理员身份 可能会出现如下错误 2 开启跳过密码验证登录的MySQL服务 在命令行输入 mysqld console skip
  • 神经网络是如何训练的,神经网络是怎么训练的

    想要学习人工神经网络 需要什么样的基础知识 人工神经网络理论百度网盘下载 链接 提取码 rxlc简介 本书是人工神经网络理论的入门书籍 全书共分十章 第一章主要阐述人工神经网络理论的产生及发展历史 理论特点和研究方向 第二章至第九章介绍人工
  • 机械臂抓取前言

    一 机械臂的一些相关概念 自由度 除去末端执行器一个机械臂上有几个电机就是几自由度机械臂 二 机械臂的抓取流程 1 读取深度摄像头的数据 2 在摄像头传输过来的图像中识别要抓取的物体 并且得到想要抓取物体的二维的像素坐标 3 将二维像素坐标
  • IDEA让包分层显示的方式

    IDEA中java包分层显示的方式 初次使用IDEA的朋友 有部分的包显示是如此显示 但是这么显示 有时会因为包的同级显示 使得包使得包的显示过多 此时就可以改变显示的方式 小齿轮 gt gt Flatten Packages Middle
  • usbcan系列便携式can分析仪

    简介 USBCAN系列便携式CAN分析仪 通过USB接口快速扩展一路CAN通道 使接入CAN网络非常容易 它具有一体式和小巧紧凑的外形 特别适合于随身携带 CAN接口采用金升阳电源模块和信号隔离芯片实现2500V DC电气隔离 USB接口E
  • 前端Vue自定义得分构成水平柱形图组件 可用于系统专业门类得分评估分析

    引入Vue自定义得分构成水平柱形图组件 cc horBarChart 随着技术的发展 传统的开发方式使得系统的复杂度越来越高 一个小小的改动或小功能的增加可能会导致整体逻辑的修改 造成牵一发而动全身的情况 为了解决这个问题 我们采用了组件化
  • 官方推荐U盘安装Ubuntu 10.10 方法

    通用USB Installer是一个Linux系统安装器 允许你从你的USB闪存驱动器选择安装一个Linux发行版 通用USB安装器使用非常方便 只需选择一个 Linux发行版的ISO文件和你的U盘便能进行安装 Universal USB
  • java用模板生成word(docx)文档(含动态表格)

    生成word思路 用WPS或者office编辑好word的样式 然后另存为word xml文档 将xml翻译为FreeMarker模板 最后用java来解析FreeMarker模板并输出Docx 编辑好需要使用的word文档 1 把需要注入
  • 在Linux上面如何部署jar包?

    1 首先打开工具Xshell或者FinalShell 并登录 2 使用 ll 命令查看根目录文件 确定jar包将要放到哪个位置 使用cd 命令进入文件 如 cd opt yt 3 新建文件传输 可和本地关联 4 将jar包直接拖过去就行 5
  • 树的遍历(中序,前序,后序)

    与只有一种逻辑遍历它们的线性数据结构 数组 链表 队列 堆栈等 不同 树可以以不同的方式遍历 常见的有中序遍历 前序遍历和后序遍历 实现各种遍历的方法又包括 以上图为例 深度优先遍历 a 中序 左 根 右 4 2 5 1 3 b 前序 根
  • 关于async & await(TAP)异步模型的异常捕获

    在TAP之前 若要捕获线程中Task的异常 通常有两种办法 1 阻塞 线程开始后 在适当的时机 调用 wait 或waitAll方法 2 非阻塞 推荐 在建立任务的时候 写该task的continueWith方法 在该方法中捕获异常 对于T
  • get提交和post提交的区别

    Http定义了与服务器交互的不同方法 最基本的方法有4种 分别是GET POST PUT DELETE URL全称是资源描述符 我们可以这样认为 一个URL地址 它用于描述一个网络上的资源 而HTTP中的GET POST PUT DELET
  • Linux安装以及使用

    Linux虚拟机安装以及使用 1 安装VMware16 2 创建虚拟机 3 虚拟机配置网络 4 利用mobaxterm连接服务器 5 配置jdk和tomcat 6 配置docker和mysql 7 部署项目 1 安装VMware16 接下来
  • leetcode160–相交链表(最优解/双指针)

    今天做的三道题比较简单 给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点 如果两个链表不存在相交节点 返回 null 题目数据 保证 整个链式结构中不存在环 注意 函数返回结果后 链表必须 保持其原