【随想】每日两题Day.7

news2024/12/29 9:38:35

题目:面试题 02.07.链表相交

给你两个单链表的头节点 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 。

提示:

  • listA 中节点数目为 m
  • listB 中节点数目为 n
  • 0 <= m, n <= 3 * 104
  • 1 <= Node.val <= 105
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • 如果 listA 和 listB 没有交点,intersectVal 为 0
  • 如果 listA 和 listB 有交点,intersectVal == listA[skipA + 1] == listB[skipB + 1]

进阶:你能否设计一个时间复杂度 O(n) 、仅用 O(1) 内存的解决方案?

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int lenA = 0;
        int lenB = 0;
        ListNode curA = headA;
        ListNode curB = headB;
        while(curA != null) {
            lenA++;
            curA = curA.next;
        }
        while(curB != null) {
            lenB++;
            curB = curB.next;
        }
        curA = headA;
        curB = headB;
        int count = 0;
        if(lenA > lenB) {
            count = lenA - lenB;
            for(int i = 0;i<count;i++) {
                curA = curA.next;
            }
        }else {
            count = lenB - lenA;
            for(int i = 0;i<count;i++) {
                curB = curB.next;
            }
        }
        while(curA != curB && curA != null && curB != null) {
            curA = curA.next;
            curB = curB.next;
        }
        if(curA == null || curB == null) return null;
        return curA;
    }
}

思考:

遍历 链表A、B计算出长度差count,让长的先走count步,然后同步走一一比较。

题目:142.环形列表Ⅱ

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:返回 null
解释:链表中没有环。

提示:

  • 链表中节点的数目范围在范围 [0, 104] 内
  • -105 <= Node.val <= 105
  • pos 的值为 -1 或者链表中的一个有效索引

进阶:你是否可以使用 O(1) 空间解决此题?

代码:

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head == null || head.next == null) return null;
        ListNode fast = head.next.next;
        ListNode slow = head.next;
        while(fast != slow && fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        if(fast == null || fast.next == null) return null;
        ListNode cur1 = fast;
        ListNode cur2 = head;
        while(cur1 != cur2) {
            cur1 = cur1.next;
            cur2 = cur2.next;
        }
        return cur1;
    }
}

思考:(重要)

这个题需要一些数学推理。经推理后的结论,定义 fast 和 slow 两个结点,fast一步走两个 ,slow一步走一个。若有环,fast和slow一定在环中相遇。那么怎么找到环的入口呢?就是让cur1在head开始走,cur2在fast、slow相遇结点开始走,当cur1 == cur2 时,此时就是环的入口!

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

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

相关文章

Excel中的宏、VBA

一、宏是什么&#xff1f; EXCEL MACRO 是一种记录和播放工具&#xff0c;它仅记录您的 Excel 步骤&#xff0c;并且宏将根据需要播放任意多次。 VBA 宏可自动执行重复任务&#xff0c;从而节省了时间。 这是一段可在 Excel 环境中运行的编程代码&#xff0c;但您无需成为编码…

EtherCAT 总线型 4 轴电机控制卡解决方案

 技术特点  支持标准 100M/s 带宽全双工 EtherCAT 总线网络接口及 CoE 通信协议一 进一出&#xff08;RJ45 接口&#xff09;&#xff0c;支持多组动态 PDO 分组和对象字典的自动映射&#xff0c;支持站 号 ID 的自动设置与保存&#xff0c;支持 SDO 的电机参数设置与…

设计模式之解析器(Interpreter)的C++实现

1、解析模式的提出 在软件开发的过程中&#xff0c;需要实现一种需求&#xff0c;该需求的结构稳定&#xff0c;但是需求的业务内容会频繁变化&#xff0c;如果使用普通语法实现需求&#xff0c;需要经常更新代码&#xff0c;不具有灵活性。可以使用解析器模式解决实现该类需求…

css花字效果

<div data-subtitle"春江潮水连海平" class"colorText">春江潮水连海平</div>.colorText{font-family:ZhanKuKuaiLeTi2016XiuDingBan;font-size: 50px;font-weight: bold;position: relative;background-image: linear-gradient(90deg,#A1B3FB…

同步 -- 自旋锁

基础学习--原子操作 typedef struct {int counter; } atomic_t;static __always_inline void atomic_set(atomic_t *v, int i) {instrument_atomic_write(v, sizeof(*v));raw_atomic_set(v, i); }static __always_inline void raw_atomic_set(atomic_t *v, int i) {arch_atomic…

集丰照明|别墅设计:从空间规划到奢华元素的精心打造

当人们谈论别墅时&#xff0c;总会不自觉地与豪华、舒适、私人空间等词汇联系在一起。确实&#xff0c;别墅作为一种住宅形式&#xff0c;其设计不仅需要满足基本的生活需求&#xff0c;更要有独特的风格和品味。本文将从别墅设计的各个方面进行探讨&#xff0c;带您领略从空间…

uni-app:通过三目运算动态增加样式效果(class)

效果 代码 第一条&#xff1a;当变量line的值等于abc时&#xff0c;class就等于yes,反之class等于no&#xff08;显然等于abc&#xff0c;执行yes,前景色为红色&#xff09; 第一条&#xff1a;当变量line1的值等于abc时&#xff0c;class就等于yes,反之class等于no&#xff…

【实验】H3C校园双出口配置案例,可跟做!

【微|信|公|众|号&#xff1a;厦门微思网络】 1.案例拓补 该拓扑图中的校园网内部分为两个网段&#xff1a;一个为学生校舍网段&#xff08;192.168.2.0&#xff09;&#xff0c;主要访问电信提供的internet服务器&#xff1b;另外一个网段为校园办公和教学用网段&#xff08;…

python 第一次作业

1.使用turtle换一个五环 2.设计这样一个程序&#xff1a;输入一个数字 判断它是不是一个质数 使用turtle换一个五环&#xff1a; >>> import turtle #导入模块 >>> turtle.width(10) #设置圆圈宽度 >>> turtle.color("blue&qu…

DC电源模块具有不同的安装方式和安全规范

BOSHIDA DC电源模块具有不同的安装方式和安全规范 DC电源模块是将低压直流电转换为需要的输出电压的装置。它们广泛应用于各种领域和行业&#xff0c;如通信、医疗、工业、家用电器等。安装DC电源模块应严格按照相关的安全规范进行&#xff0c;以确保其正常运行和安全使用。 D…

快速上手Linux基础开发工具

目录 软件包管理器 概念理解 用法示例 - 以yum为例 vim 模式的切换 常用操作 插件和配置 gcc/g gdb make / makefile 软件包管理器 概念理解 在Linux下安装软件的话&#xff0c;一个比较原始的办法是下载程序的源代码&#xff0c;然后进行编译&#xff0c;进而得到…

vscode 无法使用 compilerPath“D:.../bin/arm-none-eabi-g++.exe”解析配置。

最近在使用vscode搭建ODrive STM32开发环境,依次安装了以下内容: 1.Python3: 用于运行工程构建脚本 2.ST-Link/V2 Drivers: STLink/v2编程器的驱动 3.Visual Studio Code: 轻量级但功能强大的源代码编辑器 …

Python的简单使用与应用

在当今互联网时代&#xff0c;网络爬虫成为了获取数据的重要工具之一。而使用代理IP进行爬虫操作&#xff0c;则是提高爬虫效率、绕过访问限制的利器。本文将向大家介绍Python代理IP爬虫的简单使用&#xff0c;帮助大家了解代理IP的原理、获取代理IP的方法&#xff0c;并探索其…

花了一周时间,更新了下软考云题库Web版

花了一周时间&#xff0c;更新了下软考云题库Web版&#xff0c;体验地址和体验账户在文章最后。想体验的直接翻到最后。 软考云题库的Web版的由来 之前&#xff0c;有朋友提出在小程序中刷题不太方便&#xff0c;希望能在电脑上进行题目练习。于是&#xff0c;我们着手开发了…

AH8316芯片:高效12V转5V 5A电源解决方案

AH8316是一款内置MOS的高效电源转换芯片&#xff0c;具有广泛的应用领域。本文将介绍AH8316芯片的主要特性和性能指标&#xff0c;以及其在12V转5V 5A电源转换中的应用。 AH8316芯片主要特性&#xff1a; 1. 输入电压范围广泛&#xff1a;芯片支持7V至32V的输入电压范围&#…

阿里云无影云电脑角色AliyunServiceRoleForGws什么意思?

阿里云无影云电脑服务关联角色是指角色名称&#xff1a;AliyunServiceRoleForGws&#xff0c;并赋予角色权限策略&#xff1a;AliyunServiceRolePolicyForGws的过程&#xff0c;简单来说&#xff0c;就是允许无影云电脑服务访问您VPC、CEN和NAS中的资源&#xff0c;使用该权限查…

无涯教程-JavaScript - MINVERSE函数

描述 MINVERSE函数返回存储在数组中的矩阵的逆矩阵。 语法 MINVERSE (array)争论 Argument描述Required/OptionalArrayA numeric array with an equal number of rows and columns.Required Notes 数组可以作为单元格范围(如A1:C3)或数组常数(如{1,2,3; 4,5,6; 7,8,9})或这…

Java增强for循环(学习笔记)

Java增强for循环 主要用于数组或者集合的增强型for循环。 格式&#xff1a; for(声明语句&#xff1a;表达式){ 代码句子 } 声明语句&#xff1a;声明新的局部变量&#xff0c;该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块&#xff0c;其值与此时数组元…

Paragon NTFS For Mac2023破解版免费下载安装激活

Paragon NTFS For Mac 2023破解版是一款强大的ntfs磁盘读写工具,帮助用户在MAC电脑上读写NTFS格式的磁盘,需要解决MAC无法读写磁盘的用户可以来试试Paragon磁盘读写软件哦。 Paragon NTFS 2023 专门为解决mac读写开发的软件&#xff0c;它为中国用户量体裁衣&#xff0c;提供Ma…

iText实战--PDF和iText 简介

PDF可以做如下事务 iText 5步创建PDF import java.io.FileOutputStream; import com.itextpdf.text.Document; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.PdfWriter;public class PdfHelloWorld {/*** param args*/public static void main(String[]…