【数据结构】 单链表面试题讲解->叁

news2024/11/24 17:32:50

文章目录

  • 🍀[相交链表](https://leetcode.cn/problems/intersection-of-two-linked-lists/description/)
    • 🎄题目描述
    • 🎍示例
      • 🚩示例一
      • 🚩示例二
      • 🚩示例三
    • 🎋解法思路
      • 🚩相关变量的建立
      • 🚩求两链表的长度与差值
      • 🚩确定长短链表
      • 🚩长链表先走len步
      • 🚩同时走,找交点
    • 🌳完整代码
  • 🍀[环形链表](https://leetcode.cn/problems/linked-list-cycle/description/)
    • 🎄题目描述:
    • 🎍 示例
      • 🚩示例一
      • 🚩示例二
      • 🚩示例三
    • 🎋思路解析:
    • 🌴扩展问题
    • 🌳完整代码:
  • 🍀[环形链表||](https://leetcode.cn/problems/linked-list-cycle-ii/description/)
    • 🎄题目描述:
    • 🎍示例
      • 🚩示例一
      • 🚩示例二
      • 🚩示例三
    • 🎋思路解析:
    • 🌳完整代码
  • ⭕总结

🌏引言
单链表的操作算法是笔试面试中较为常见的题目。
本文将着重介绍平时面试中常见的关于链表的应用题目,马上要进行秋招了。希望对你们有帮助 _😀
在这里插入图片描述

🍀相交链表

🎄题目描述

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

图示两个链表在节点 c1 开始相交:
在这里插入图片描述

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

/**
 * 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) {
  
    }
}

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

🎍示例

🚩示例一

在这里插入图片描述

🚩示例二

在这里插入图片描述

🚩示例三

在这里插入图片描述

🎋解法思路

我们发现,两个链表如果相交
在这里插入图片描述
那我们就可以让长链表先走等于它们之间差值的步数

然后再同时出发,当两指针相等时,返回该节点

🚩相关变量的建立

我们将

  • 长的链表用指针log表示
  • 短的链表用指针sot表示
  • 链表headA的长度用lenA表示
  • 链表headB的长度用lenB表示
  • len为lenA与LenB的差值

🚩求两链表的长度与差值

直接遍历,然后相减即可

	while(log != null) {
            log = log.next;
            lenA ++;
        }
        while(sot != null) {
            sot = sot.next;
            lenB ++;
        }
        int len = lenA - lenB;

🚩确定长短链表

因为我们一开始并不知道两个链表谁长谁短,所以博主再赋初始值时,给log赋值的是headA;给sot赋值的是sot;

ListNode log = headA;
ListNode sot = headB;

判断len:

  • len<0说明headB长度大于headA
  • 交换log与sot,len值重置;
log = headB;
sot = headA;
len = lenB - lenA;

注意:如果len大于0,因为我们的log与sot的值已经改变,所以我们需要重新赋值

代码实现如下:

 		if(len < 0) {
            len = lenB - lenA;
            log = headB;
            sot = headA;
        } else {
            log = headA;
            sot = headB;
        }

🚩长链表先走len步

 while(len != 0) {
            log = log.next;
            len--;
        }

🚩同时走,找交点

		while(log != sot) {
            log = log.next;
            sot = sot.next;
        }

🌳完整代码

/**
 * 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) {
        ListNode log = headA;
        ListNode sot = headB;
        int lenA = 0;
        int lenB = 0;
        while(log != null) {
            log = log.next;
            lenA ++;
        }
        while(sot != null) {
            sot = sot.next;
            lenB ++;
        }
        int len = lenA - lenB;
        if(len < 0) {
            len = lenB - lenA;
            log = headB;
            sot = headA;
        } else {
            log = headA;
            sot = headB;
        }
        while(len != 0) {
            log = log.next;
            len--;
        }
        while(log != sot) {
            log = log.next;
            sot = sot.next;
        }
        return log; 
    }
}

🍀环形链表

🎄题目描述:

给你一个链表的头节点 head ,判断链表中是否有环。

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

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
       
    }
}

🎍 示例

🚩示例一

在这里插入图片描述

🚩示例二

在这里插入图片描述

🚩示例三

在这里插入图片描述

🎋思路解析:

快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表起始位置开始运行,如果链表带环则一定会在环中相遇,否则快指针率先走到链表的末尾。

比如环形操场上跑步:
在这里插入图片描述

🌴扩展问题

  • 为什么快指针每次走两步,慢指针走一步可以? 假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。当慢指针刚进环时,可能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。此时,两个指针每移动一次,之间的距离就缩小一步,不会出现每次刚好是套圈的情况,因此:在慢指针走到一圈之前,快指针肯定是可以追上慢指 针的,即相遇。

快指针一次走3步,走4步,…n步行吗?

  • 在这里插入图片描述

🌳完整代码:

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

🍀环形链表||

🎄题目描述:

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

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

不允许修改 链表。

🎍示例

🚩示例一

在这里插入图片描述

🚩示例二

在这里插入图片描述

🚩示例三

在这里插入图片描述

🎋思路解析:

让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。

图解如下:
在这里插入图片描述

🌳完整代码

/**
 * 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) {
        ListNode fast = head;
        ListNode slow = head;
        ListNode cur = head;
        int count = 0;
        while(fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow) {
                count = 1;
                break;
            }
        }
        if(count == 0) {
            return null;
        }
    
        while(cur != slow) {
            slow = slow.next;
            cur = cur.next;
        }
        return cur;
    }
}

⭕总结

关于《【数据结构】单链表面试题讲解->叁》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

Elasticsearch(十三)搜索---搜索匹配功能④--Constant Score查询、Function Score查询

一、前言 之前我们学习了布尔查询&#xff0c;知道了filter查询只在乎查询条件和文档的匹配程度&#xff0c;但不会根据匹配程度对文档进行打分&#xff0c;而对于must、should这两个布尔查询会对文档进行打分&#xff0c;那如果我想在查询的时候同时不去在乎文档的打分&#…

多传感器分布式融合算法——加权最小二乘WLS融合/简单凸组合SCC融合

加权最小二乘WLS融合/简单凸组合SCC融合——多传感器分布式融合算法 原创不易&#xff0c;路过的各位大佬请点个赞 主要讲解算法&#xff1a; 加权最小二乘融合WLS 简单凸组合融合SCC 应用于: 多传感器网络协同目标跟踪/定位/导航 联系WX: ZB823618313 目…

【Python】理解作用域:内置、全局、局部

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 一、基础数据类型1.整型1.函数中加global&#xff08;2&#xff09;函数中不加global&#xff08;3&#xff09;报错 二、组合数据类型1.列表…

AI让儿童绘画动起来-程序员带娃必备

项目效果演示 项目描述 很多小朋友在学习绘画的过程中&#xff0c;创作出来很多比较有创意的作品&#xff0c;那么怎么让这些作品&#xff0c;动起来&#xff0c;甚至是和拍摄的视频进行互动呢&#xff0c;今天分享的这个项目&#xff0c;能够完美解决这个问题。 项目地址http:…

ASEMI整流桥KBP210和2W10能代换吗

编辑-Z 在电子世界中&#xff0c;整流桥是最常见和最重要的组件之一。它是将交流电转换为直流电的重要设备。在这篇文章中&#xff0c;我们将深入了解两款常见的整流桥&#xff1a;KBP210和2W10&#xff0c;以及它们是否可以互换使用。 首先&#xff0c;我们需要关注的是这两种…

网上可做的兼职副业,分享3个靠谱办法,快来收藏

不知道从何时起&#xff0c;越来越多的人开始在网上做兼职&#xff0c;兼职逐渐的成为上班族和大学生的第二件事。相比线上&#xff0c;他们不愿意做传统的发传单、或者体力活兼职。线上兼职也是在互联网和智能手机的影响下被广泛使用了吧。但是网上的兼职这么多&#xff0c;那…

[Mac软件]Pixelmator Pro 3.3.12 专业图像编辑中文版

Pixelmator Pro是专为Mac设计的功能强大&#xff0c;美观且易于使用的图像编辑器。借助广泛的专业级无损图像编辑工具&#xff0c;Pixelmator Pro可使您发挥出最佳的照片效果&#xff0c;创建华丽的构图和设计&#xff0c;绘制&#xff0c;绘画&#xff0c;应用令人惊叹的效果&…

融云:AI 机器人在社交软件中的花样存在

最近 AIGC 行业的新话题来自 HeyGen 的一段自动生成视频。关注【融云全球互联网通信云】了解更多 一眼看上去“真”到吓人&#xff0c;手势、嘴型等细节逼近真人效果。 除了&#xff0c;眨眼的频率有点高。 图源&#xff1a;HeyGen 这是 AI 数字人公司 HeyGen 即将推出的超逼…

基于Vue的3D饼图

先看效果: 再看代码: <template><div class="container"><div style="height: 100%;width: 100%;" id="bingtu3D"></div></div></template> <script> import "echarts-liquidfill"; imp…

python命令行or控制台or日志带有颜色的输出

python命令行or控制台or日志带有颜色的输出 python控制台带颜色输出 在几年前&#xff0c;我写过一个项目&#xff0c;喜欢花里胡哨的我看到别人输出到控制台带有颜色&#xff0c;于是我也想要。 于是乎不知道从哪里搜到的资料&#xff0c;是拼凑起来的颜色代码块。 当时用着…

服务注册中心 Eureka

服务注册中心 Eureka Spring Cloud Eureka 是 Netflix 公司开发的注册发现组件&#xff0c;本身是一个基于 REST 的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力。 Eureka 有 3 个角色 服务中心&#xff08;Eureka Server&#xff09;&#xff1a;…

【Apollo学习笔记】——规划模块TASK之PATH_REUSE_DECIDER

文章目录 前言PATH_REUSE_DECIDER功能简介PATH_REUSE_DECIDER相关配置PATH_REUSE_DECIDER总体流程PATH_REUSE_DECIDER相关子函数IsCollisionFreeTrimHistoryPathIsIgnoredBlockingObstacle和GetBlockingObstacleS Else参考 前言 在Apollo星火计划学习笔记——Apollo路径规划算…

1克硬件变化+99%软件能力,点燃XR行业第二时代之战

夕小瑶科技说 原创 作者 | 卖萌酱 你的下一代手表&#xff0c;可以是没有手表&#xff01;即将在8月26日发布空间计算新品的Rokid&#xff0c;近日发表路透视频&#xff1a;AR眼镜使用场景下&#xff0c;抬起手腕就能出现虚拟手表表盘&#xff0c;握一下拳即切换到天气模式。…

0006Java程序设计-jsp婚恋交友网设计与实现

摘 要 在线交友是互联网发展的必然产物&#xff0c;它改变了人们的网络交往形态&#xff0c;使得人们的即时通信变得更加的直观和亲切&#xff0c;并且具有良好的发展趋势。 婚恋交友网站我们使用 Microsoft公司的JSP开发工具&#xff0c;利用其提供的各种面向对象的开发工具…

武汉凯迪正大—变比组别测试仪

一、概述 在电力变压器的半成品、成品生产过程中&#xff0c;新安装的变压器投入运行之前以及根据国家电力部的预防性试验规程中&#xff0c;要求变压器进行匝数比或电压比测试。传统的变比电桥操作繁琐&#xff0c;读数不直观&#xff0c;且要进行必要的换算&#xff0c;测试时…

关于 大屏项目的参考

1、自适应组件 &#xff1a; v-scale-screen https://huaweicloud.csdn.net/638eec6cdacf622b8df8dc59.html 2、参考项目&#xff1a; https://zhuanlan.zhihu.com/p/634382389

leetcode 714. 买卖股票的最佳时机含手续费

2023.8.22 本题和买卖股票的最佳时机II 几乎一样&#xff0c;就是增加了一个手续费&#xff0c;需要在卖出股票的时候减去手续费fee即可。 代码如下&#xff1a; class Solution { public:int maxProfit(vector<int>& prices, int fee) {vector<vector<int&g…

第十六课、利用 EnigmaVB 打包 Qt 应用程序

功能描述&#xff1a;详细介绍如何利用 EnigmaVB 打包 Qt 应用程序&#xff0c;从 EnigmaVB 软件下载、安装&#xff0c;到如何使用&#xff0c;一步步教你走进 EnigmaVB 软件&#xff0c;最后还介绍了一款针对 Enigma Virtual Box 制作的单文件程序进行解包的工具 EnigmaVBUnp…

利用全志H616 MangoPi MQ Quad部署一个网络摄像头

本文男二号海康威视720p USB摄像头出场&#xff0c;尊容如下&#xff1a; SBC需连接网络&#xff1a; rootorangepizero2:~# ifconfig wlan0: flags4163< UP,BROADCAST,RUNNING,MULTICAST > mtu 1500inet 192.168.99.217 netmask 255.255.255.0 broadcast 192.168.99…

诺依框架ruoyi.js添加默认当年日期范围

ruoyi.js添加方法 // 默认当年日期范围如&#xff1a;2023-01-01到2023-08-22&#xff08;至今&#xff09; export function defaultYearDate(data) {// this.dateDefaultShow new Date();// this.dateDefaultShow.setMonth(new Date().getMonth() - 1);const end new Date…