LeetCode题目笔记——面试题 02.07. 链表相交

news2024/11/28 0:58:32

文章目录

    • 题目描述
    • 题目难度——简单
    • 方法一:数数,然后遍历
      • 代码/C++
    • 方法二:双指针
      • 代码/C++
      • 代码/Python
    • 总结

题目描述

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:

在这里插入图片描述

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

注意,函数返回结果后,链表必须 保持其原始结构 。

  • 示例 1:

在这里插入图片描述

  • 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
    输出:Intersected at ‘8’
    解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
    从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
    在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

  • 示例 2:

在这里插入图片描述

  • 输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
    输出:Intersected at ‘2’
    解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
    从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。
    在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

  • 示例 3:

在这里插入图片描述

  • 输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
    输出:null
    解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
    由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
    这两个链表不相交,因此返回 null 。

题目难度——简单

方法一:数数,然后遍历

  注意,这个题要求判断的是结点相交,也就是结点要相同,而不是结点上的值相同,不注意的话很容易把判断条件写成值是否相同。
  如果两个链表长度相同,那就可以从开头开始遍历,每次看当前位置往后的节点是否都相同,是的话就返回当前结点,否则就继续往后看,这是最简单也是最容易想到的方法,但是效率很差,要先遍历两个链表数有多少个结点,然后还要再遍历一次,每次还要往后遍历,效率很差,不推荐。

代码/C++

/**
 * 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 *pa, *pb, *tmpa, *tmpb;
        pa = headA, pb = headB;
        int lena = 0, lenb = 0, k;
        while(pa || pb){
            if(pa){
                lena++;
                pa = pa->next;
            }
            if(pb){
                lenb++;
                pb = pb->next;
            }
        }
        pa = lena > lenb ? headA : headB;
        pb = lena > lenb ? headB : headA;
        k = lena > lenb ? lena - lenb : lenb - lena;
        while(k){
            pa = pa->next;
            k--;
        }
        bool tag = false;
        while(pa && pb){
            tag = true;
            tmpa = pa, tmpb = pb;
            while(tmpa && tmpb){
                if(tmpa != tmpb){
                    tag = false;
                    break;
                }
                tmpa = tmpa->next;
                tmpb = tmpb->next;
            }
            if(tag){
                return pa;
            }
            pa = pa->next;
            pb = pb->next;
        }
        return NULL;
    }
};

在这里插入图片描述

方法二:双指针

  这个办法也是在上一个的基础上想了半天想不出来更好的之后,去评论区学习的,大佬链接,基于这样一个实时,如果拿两个指针同时遍历一次两个链表并计数,那么最后两个指针走过的节点数肯定相同,而假如两个链表有交叉点的话,两个指针在遍历的过程中肯定会碰到,于是就可以写出很简单的代码了。

代码/C++

/**
 * 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 *pa = headA, *pb = headB;
        while(pa != pb){
            pa = pa ? pa->next : headB;
            pb = pb ? pb->next : headA;
        }
        return pa;
    }
};

代码/Python

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        pa, pb = headA, headB
        while pa != pb:
            pa = pa.next if pa else headB
            pb = pb.next if pb else headA
        
        return pa

在这里插入图片描述

总结

  第一种方法,如果两个链表长度一样(n),且不相交的话,最坏就要比较(n + n - 1 + n- - 2 +…+1)次,所以时间是O(N2),只用到了几个变量,因此空间是O(1)。第二种方法只需要遍历一次两个链表,所以时间是O(N),空间同样是O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

假期无聊,不如一起刷《剑指offer》(第六天)

剑指 Offer 41. 数据流中的中位数 剑指 Offer 41. 数据流中的中位数 这道题是求数据流的中位数,一般情况我们可以采用排序的方式很轻松的找出中位数。如果我们采用插入排序的话,每次插入数字的时间复杂度大概是O(N),怎么能让这个时间更短呢&a…

shell原理及Linux权限

shell及Linux权限 目录shell及Linux权限一、指令1.tar指令(重要)2.热键3.bc命令4.uname –r指令:5.关机6.以下命令作为扩展:二.shell命令以及运行原理三.权限1.权限的概念:2.Linux下有两种用户:超级用户(ro…

一图读懂mybatis 查询接口的源码流程

图比较大:如果看着比较糊的话,可以下载高清图:https://download.csdn.net/download/langwuzhe/87376216 第一步:创建 StatementHandler、ParameterHandler、ResultSetHandler-----------(三剑客的新生) 创建 StatementHandler 对…

WPS怎么转换PDF?保证你一学就会

相信大家在处理文件的时候肯定会使用到WPS文件,WPS文件包括Word、Excel、PPT文件,是我们经常使用的几种文件,有这几种文件我们可以更好的完成工作,但是在有些情况下,我们需要将WPS转换成PDF文件,这样就会更…

AS弹性伸缩简单介绍

AS 介绍 弹性伸缩(AutoScaling)是一种服务,可以自动调整弹性计算资源(ECS),以满足业务需求的变化。 弹性伸缩仅支持ECS实例或ECI实例数量的增加和减少,但不支持单个ECS实例或ECI实例的配置变更。 应用场景:弹性扩张、…

Windows安装使用Docker,方便你的开发和部署(DockerDesktop篇)

前言 首先声明,此篇不是完全的Docker技术文章,而是单纯的教你使用Docker,不包含Docker的一些命令、如何打包Docker镜像等等。 为什么要用Docker? 大家好,我是小简,今天带来一篇Windosw环境下使用Docker的…

女生学软件测试有什么优势么

在IT技术行业,女生学习软件测试还是有很大优势的。女生相较于男生更有耐心,包容性强,心思细腻,对细节把控更好,同时还能帮助团队男女平衡,活跃气氛。 软件测试是一个只要你肯学习就会有回报的职业&#xf…

判断用户输入的数字是奇数还是偶数

判断用户输入的数字是奇数还是偶数代码关键知识点 条件运算符, 相等运算符,为了让两个不同的数据类型(如number和string)的值可以作比较,必须要把一种类型转换为另一种类型(转换成相同的类型)&…

Ae 效果详解:CC Ball Action

Ae菜单:效果/模拟/CC Ball ActionEffect/Simulation/CC Ball ActionCC Ball Action (滚珠操作效果)可以将所有的像素变成小球模样,并且能够打破图层成球形网格。可通过摄像机观察其所具有的 3D 效果。◆ ◆ ◆效果控件属性说明S…

【数据结构与算法——C语言版】6. 排序算法(4)——快速排序

前言 本文介绍排序算法中的快速排序,快速排序是比较常用的一种排序算法,也是面试中经常会问到的一种排序算法,简称快排,是我们要介绍的第一种时间复杂度为O(nlogn)的排序算法。 核心思想 快速排序(Quick Sort)使用分治法策略&a…

Vue--》详解状态管理工具——Vuex

目录 vuex 搭建vuex环境 vuex的使用 vuex开发者工具使用 getters mapState和mapGetters mapMutations和mapActions 多组件共享数据 vuex实现模块化 vuex 专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管…

c语言进阶(4)——字符函数的详细解析

文章目录1.strlen函数2.strcpy函数3.strcat函数4.strcmp函数5.strncpy函数6.strncat函数7.strncmp函数8.strstr函数9.strtok函数10. strerror函数11. 相关字符转换函数12.字符转换函数1.strlen函数 size_t strlen( const char *string ); 用途:用来计算字符串长度的…

【云原生进阶之容器】第二章Controller Manager原理2.8节--Resync机制

8 Resync机制 8.1 DeltaFIFO队列为什么需要Resync 为什么需要 Resync 机制呢?因为在处理 SharedInformer 事件回调时,可能存在处理失败的情况,定时的 Resync 让这些处理失败的事件有了重新 onUpdate 处理的机会。 主要的目的是为了不丢数据,处理 resync 机制还有边缘触发与…

公务员考试催生一家上市公司,公务员真的是一条好的出路吗

公务员考试能催生一家公司吗?还真的可以,而且在2023.01.09日也就是今天上市。公务员真的是一条好的出路吗,现在考公务员还行不行?这需要结合我们当下的环境来综合分析。我们都经历了疫情,期间各个大厂频频将裁员大棒挥…

《Spring揭秘》读书笔记 1:IoC和AOP

1 Spring框架的由来 Spring框架的本质:提供各种服务,以帮助我们简化基于POJO的Java应用程序开发。 各种服务实现被划分到了多个相互独立却又相互依赖的模块当中: Core核心模块:IoC容器、Framework工具类。 AOP模块:S…

如何抓住风口,利用互联网赚钱?(內含三大商业模式推荐)建议收藏

大家好,我是你们熟悉而又陌生的好朋友梦龙,一个创业期的年轻人 今天跟你做个分享,众所周知互联网是一块非常大的蛋糕,几位互联网巨头也做不到完全吃透,同时也是一个门槛较低的创业之路,非常的适合年轻人&a…

8、Javaweb_ServlethttpRequst

Servlet: 1. 概念 2. 步骤 3. 执行原理 4. 生命周期 5. Servlet3.0 注解配置 6. Servlet的体系结构 Servlet -- 接口 | GenericServlet -- 抽象类 | HttpServlet -- 抽象类 * GenericServlet:将Servlet接口中其他的方…

C语言-指针进阶-常见笔试面试题详解(9.4)

目录 思维导图&#xff1a; 指针和数组笔试题 指针笔试题 写在最后&#xff1a; 思维导图&#xff1a; 指针和数组笔试题 只有多刷题&#xff0c;才能巩固提高所学的知识。 例1&#xff1a; #include <stdio.h>int main() {//一维数组int a[] { 1,2,3,4 };//求出…

「精研科技」× 企企通,全球MIM龙头借助采购供应商数字化向多领域突破

近日&#xff0c;金属粉末注射成型&#xff08;MIM&#xff09;龙头企业江苏精研科技股份有限公司&#xff08;以下简称“精研科技”&#xff09;与企企通达成合作。双方将共同构建完整的采购管理和供应商协同平台&#xff0c;加强供应商管理&#xff0c;提高采购效率&#xff…

Netty源码性能分析 - ThreadLocal PK FastThreadLocal

序 既然jdk已经有ThreadLocal&#xff0c;为何netty还要自己造个FastThreadLocal&#xff1f;FastThreadLocal快在哪里&#xff1f;这需要从jdk ThreadLocal的本身说起。在java线程中&#xff0c;每个线程都有一个ThreadLocalMap实例变量&#xff08;如果不使用ThreadLocal&…