作者简介:大家好,我是未央;
博客首页:未央.303
系列专栏:笔试强训选择题
每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!!!
文章目录
文章目录
前言
一.判断链表中是否有环
题目描述
解题分析
二.链表中倒数最后k个结点
题目描述
解题分析
总结
前言
今天是算法题第2天,今天的题我们主要学会了掌握双指针的有关题型(快慢指针);
一.判断链表中是否有环
题目描述
描述
判断给定的链表中是否有环。如果有环则返回true,否则返回false。
数据范围:链表长度 0≤100000≤n≤10000,链表中任意节点的值满足 ∣val∣<=100000;
要求:空间复杂度 O(1),时间复杂度 O(n)。
输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面。-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编程时读入的是链表的头节点。
举例说明:
例如输入{3,2,0,-4},1时,对应的链表结构如下图所示:
可以看出环的入口结点为从头结点开始的第1个结点(注:头结点为第0个结点),所以输出true。
示例1:
示例2:
示例3:
解题分析
解题思路:
本题我们采用双指针方法进行解析题目;
我们使用两个指针,fast 与 slow。
它们起始都位于链表的头部。随后,slow 指针每次向后移动一个位置,而fast 指针向后移动两个位置。
如链表中存在环,则 fast 指针最终将再次与 slow 指针在环中相遇;否则无法相遇没有环;
图示解析:
代码编写思路步骤:
步骤1.初始化两个指针,一个称为“快指针”(fast)和一个称为“慢指针”(slow),并将它们都指向链表的头节点。
步骤2.在循环中,快指针每次移动两步,慢指针每次移动一步。这样,快指针将比慢指针走得更远。
步骤3.如果链表中存在环,快指针最终会追上或与慢指针相遇。如果不存在环,快指针将会先到达链表的末尾,完成循环。
4.当快指针与慢指针相遇时,说明链表中存在环,可以返回 true。如果快指针达到链表的末尾而没有与慢指针相遇,则说明链表中没有环,可以返回 false。
代码编写:
二.链表中倒数最后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:
示例2:
解题分析
解题思路:
本题我们采用快慢指针的方法进行解决;
第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针同时移动,当第一个指针到链表的末尾的时候,返回第二个指针即可;此时第二个指针所在的位置就是返回的倒数第k个结点;
图示解析:
代码编写思路步骤:
1.初始化两个指针,一个称为“快指针”(fast)和一个称为“慢指针”(slow),并将它们都指向链表的头节点。
2.将快指针先向前移动k个节点,使得快指针与慢指针之间相差k个节点。
3.然后,同时移动快慢指针,直到快指针到达链表的末尾。在这个过程中,快慢指针之间始终保持k个节点的距离。
4.当快指针到达链表末尾时,慢指针指向的节点就是倒数第k个节点。
注意:如果链表的长度小于k,即快指针到达末尾之前链表已经结束,这时就无法找到倒数第k个节点。
代码编写: