快慢指针,若有循环两指针终会相遇。
注意!!!考虑好next在哪,条件是什么,是否有下一个节点。
var hasCycle = function(head) {
if(head==null||head.next==null){return false;}
let fast = head.next;
let slow = head;
while(slow!=fast){
if(fast==null||fast.next==null){return false}
else{slow = slow.next;fast = fast.next.next;}
}
return true;
};
哈希表法
var hasCycle = function(head) {
let map = new Map();
while(head){
if(map.has(head)){return true;}
map.set(head);
head = head.next;
}
return false;
};
哈希表的用法,先创建哈希表,使用set函数存入,使用has函数查找。
自己想的,时间超长,链表变两个数组比较。
var isPalindrome = function(head) {
let arr1 =[];
let arr2 =[]
while(head!=null){
const cur = head.val;
arr1.push(cur);
arr2.unshift(cur);
head = head.next;
}
return JSON.stringify(arr1)==JSON.stringify(arr2)?true:false;
};
注意的是,看数组是否相等不能直接==判断。JSON.stringify()
或者改为字符串比较arr1.toString()==arr2.toString()
看了解析,把两个数组变为一个数组,结果快了非常多。
var isPalindrome = function(head) {
let arr =[];
while(head!=null){
const cur = head.val;
arr.push(cur);
head = head.next;
}
let len =arr.length;
for(let i= 0,j=len-1;i<len/2;i++,j--){
if(arr[i]!=arr[j])return false;
}
return true;
};
var getIntersectionNode = function(headA, headB) {
if(headA==null||headB==null){
return null;
}
let pa = headA;
let pb = headB;
while(pa!=pb){
if(!pa){
pa = headB;
}else{pa = pa.next;}
if(!pb){
pb = headA;
}else{pb = pb.next;}
}
return pa;
};
题目要求,不改变原始结构,不能反转链表了。学要动脑子的,消除长度差找到相同的地方。
哈希表,存储搜索,复杂度略高
var getIntersectionNode = function(headA, headB) {
let map = new Map();
let pa = headA;
let pb = headB;
while(pa){
map.set(pa);
pa = pa.next;
}
while(pb){
if(map.has(pb)){return pb;}
pb = pb.next;
}
return null;
};