力扣链表题集锦上(JS版)

141、环形链表

给定一个链表,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
要求空间复杂度为O(1)

分析:这个题可以采用暴力的把所有信息都存放在哈希表中,这样的话,虽然很好想到,但是空间复杂度过高。所以我们采用一种快慢指针的思想。定义两个指针,一个快指针,一个慢指针,快指针每次向前走两个单位,慢指针向前走一个单位。加入快指针走到null还没有相遇,那么显然该链表中不存在环;加入链表中存在环形,那么不论环的大小,就像小学数学中在操场上跑步的问题一样,快慢指针始终会相遇。所以只要快慢指针相遇,那么就说明链表是有环的。

在这里插入图片描述

142、环形链表进阶

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

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
说明:不允许修改给定的链表。
用 O(1) 空间解决此题

分析:本质上和上一个题目一样,就是需要我们返回入环点而已。我们采用快慢指针的方法,假设快指针的速度是慢指针的两倍。加入没有有环的话,那么显然快指针会走到头,和上一个题是一样的。当慢指针到达入环口的时候,这时候快指针应该走了慢指针两倍的路程。当二者相遇的时候,相遇点距离入环口的位置和起点到入环口的位置应该是相等的(这个很简单,自己画画图就能画出来),这时候让两个指针,分别从起点和相遇点相向而行,二者相遇的地方就是入环点。

在这里插入图片描述

202、快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 true ;不是,则返回 false 。

分析:这道题看起来难度不小,但其实上,和第一个问题有着千丝万缕的联系,甚至可以说,本质就是第一个题目。数字变化的结果是固定的,比如说19的下一次变化一定是1的平方加9的平方等于82,所以说我们可以把每一个数字都看成是链表的一个节点,这样的话,快指针移动两个单位,也就是说运算两次,慢指针移动一个单位,也就是运算一次。对于最终的判断条件,我们可以这样进行类比,运算结果为1可以理解为指向了空指针,快慢直接重叠,就表示已经没有办法等于1了,也就是说,初始的数不是快乐数。

在这里插入图片描述

特别注意:第六行代码,快指针必须要比慢指针提前走一步,二者不能在一起开始,因为循环中判断的条件是,二者不相等,不然就会直接退出判断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值