141环形链表
查找是否为环形链表 快慢指针问题
var hasCycle = function(head) {
let slowHead = head
let fastHead = head
while(fastHead && fastHead.next) {
slowHead = slowHead.next
fastHead = fastHead.next.next
if(slowHead === fastHead) {
return true
}
}
return false
}
### 142环形链表的入环节点
快慢指针相遇后,理解为快指针比慢指针走了双倍的距离,所以这时让快指针从头单步递增,慢指针同步,两者相遇则为入环节点
var detectCycle = function(head) {
let slowHead = head
let fastHead = head
while(fastHead && fastHead.next) {
slowHead = slowHead.next
fastHead = fastHead.next.next
if(slowHead === fastHead) {
fastHead = head
while(slowHead !== fastHead) {
slowHead = slowHead.next
fastHead = fastHead.next
}
return slowHead
}
}
return null
};
### 287寻找重复数
寻找重复数,转化为快慢指针问题,数组中的数字为0-n-1,且一定会出现重复
var findDuplicate = function(nums) {
let slowPointer = 0
let fastPointer = 0
while (true) {
slowPointer = nums[slowPointer]
fastPointer = nums[nums[fastPointer]]
if (slowPointer == fastPointer) {
let _slowPointer = 0
while (nums[_slowPointer] !== nums[slowPointer]) {
slowPointer = nums[slowPointer]
_slowPointer = nums[_slowPointer]
}
return nums[_slowPointer]
}
}
};
网友评论