链表
24. 两两交换链表中的节点
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var swapPairs = function(head) {
let ret =new ListNode(0,head),temp=ret;
while(temp.next&&temp.next.next) {
let cur=temp.next.next,pre=temp.next;
pre.next=cur.next;
cur.next=pre;
temp.next=cur;
temp=pre;
}
return ret.next
};
//首先创建虚拟头节点,然后用临时节点把要操作的节点保存下来,再交换位置,结束的条件为节点的下一个节点或者下下个为空
//注意点,不要操作空指针
142. 环形链表 II
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var detectCycle = function(head) {
let fast=head,slow=head;
if(!head||!head.next) {
return null;
}
while(fast.next&&fast.next.next) {
slow=slow.next;
fast=fast.next.next;
if(fast==slow) {
slow=head;
while(fast!==slow) {
fast=fast.next;
slow=slow.next;
}
return slow
}
}
return null
};
//首先是判断有没有环,快指针每次走两步,慢指针走一步,当他们有相遇时,即为有环,否则返回null
//然后判断哪个是开始的节点,设慢指针走了x+y,快指针走了x+n(y+z)+y 得2(x+y)=x+y+n(y+z) x=(n-1)(y+z)+z 所以x和y相遇的点为开始点
//注意点,不要操作空指针
19. 删除链表的倒数第 N 个结点
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
var removeNthFromEnd = function(head, n) {
let ret =new ListNode(0,head),temp=ret,fast=ret,slow=ret;
while(n-->=0) {
fast=fast.next
}
while(fast) {
fast=fast.next
slow=slow.next
}
slow.next=slow.next.next
return ret.next
};
//首先快指针移动n+1,然后分别移动快慢指针直到快指针为null,改变慢指针的next即可
哈希表
242. 有效的字母异位词
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if(s.length!==t.length) return false;
let arr =new Array(26).fill(0);
let base = 'a'.charCodeAt();
for(const i of s) {
arr[i.charCodeAt()-base]++;
}
for(const i of t) {
if(!arr[i.charCodeAt()-base]) return false
arr[i.charCodeAt()-base]--;
}
return true;
};
//数据范围小数量小用数组,反正用set,有key value用map
//用哈希特性,首先遍历第一个数组,出现的进行++,第二个数组首先如果有为0的即与第一个数组有不同的元素,不为0则进行--