【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点

作者简介:大家好,我是未央;

博客首页:未央.303

系列专栏:笔试强训选择题

每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!!!

文章目录

文章目录

前言

一.判断链表中是否有环

题目描述

 解题分析

二.链表中倒数最后k个结点

题目描述

 解题分析

总结



前言

今天是算法题第2天,今天的题我们主要学会了掌握双指针的有关题型(快慢指针);


一.判断链表中是否有环

题目描述

描述

判断给定的链表中是否有环。如果有环则返回true,否则返回false。

数据范围:链表长度 0≤100000≤n≤10000,链表中任意节点的值满足 ∣val∣<=100000;

要求:空间复杂度 O(1),时间复杂度 O(n)。


输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面。-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编程时读入的是链表的头节点。


举例说明:

例如输入{3,2,0,-4},1时,对应的链表结构如下图所示:

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第1张图片

可以看出环的入口结点为从头结点开始的第1个结点(注:头结点为第0个结点),所以输出true。 


示例1:

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第2张图片


示例2:

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第3张图片


示例3:

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第4张图片


 解题分析

解题思路:

本题我们采用双指针方法进行解析题目;

我们使用两个指针,fast 与 slow。

它们起始都位于链表的头部。随后,slow 指针每次向后移动一个位置,而fast 指针向后移动两个位置。

如链表中存在环,则 fast 指针最终将再次与 slow 指针在环中相遇;否则无法相遇没有环;


图示解析:

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第5张图片


代码编写思路步骤:

步骤1.初始化两个指针,一个称为“快指针”(fast)和一个称为“慢指针”(slow),并将它们都指向链表的头节点。


步骤2.在循环中,快指针每次移动两步,慢指针每次移动一步。这样,快指针将比慢指针走得更远。


步骤3.如果链表中存在环,快指针最终会追上或与慢指针相遇。如果不存在环,快指针将会先到达链表的末尾,完成循环。


4.当快指针与慢指针相遇时,说明链表中存在环,可以返回 true。如果快指针达到链表的末尾而没有与慢指针相遇,则说明链表中没有环,可以返回 false。

代码编写:

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第6张图片

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第7张图片

二.链表中倒数最后k个结点

题目描述

描述

输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。

如果该链表长度小于k,请返回一个长度为 0 的链表。


数据范围:0≤1050≤n≤105,0≤090≤ai​≤109,0≤090≤k≤109;

要求:空间复杂度 O(n),时间复杂度O(n)。

进阶:空间复杂度 O(1),时间复杂度O(n)。


举例说明:
例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:

 其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。

示例1:

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第8张图片


示例2:


 解题分析

解题思路:

本题我们采用快慢指针的方法进行解决;
第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针同时移动,当第一个指针到链表的末尾的时候,返回第二个指针即可;此时第二个指针所在的位置就是返回的倒数第k个结点;


图示解析:

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第9张图片


代码编写思路步骤:

1.初始化两个指针,一个称为“快指针”(fast)和一个称为“慢指针”(slow),并将它们都指向链表的头节点。


2.将快指针先向前移动k个节点,使得快指针与慢指针之间相差k个节点。


3.然后,同时移动快慢指针,直到快指针到达链表的末尾。在这个过程中,快慢指针之间始终保持k个节点的距离。


4.当快指针到达链表末尾时,慢指针指向的节点就是倒数第k个节点。


注意:如果链表的长度小于k,即快指针到达末尾之前链表已经结束,这时就无法找到倒数第k个节点。


代码编写:

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第10张图片

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第11张图片

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第12张图片

总结

【牛客面试必刷TOP101】Day2.判断链表中是否有环和链表中倒数最后k个结点_第13张图片

你可能感兴趣的:(牛客面试必刷TOP101,数据结构,链表,算法题,java)