- 数组
- 链表
- 1.合并两个有序链表【easy】">1.合并两个有序链表【easy】
- 判断链表中是否有环【easy】">2.判断链表中是否有环【easy】
- 相交链表【easy】">3. 相交链表【easy】
- 链表的中间结点 【easy】">4. 链表的中间结点 【easy】
- 合并K个升序链表【hard】">4.合并K个升序链表【hard】
- 单链表的倒数第-k-个节点">单链表的倒数第-k-个节点
数组
两数之和

/*** @param {number[]} nums* @param {number} target* @return {number[]}*/var twoSum = function(nums, target) {//1.创建一个map//2.遍历数组,查找map结构里是否有 target-num[i] 这个值,如果有,返回该下标和i//3.如果没有的话,把数组的值和键塞进map结构【注意:以数组的值作为map的键,方便后续访问】const map = new Map();for(let i = 0;i < nums.length;i++){if(map.has(target-nums[i])){return [map.get(target-nums[i]),i]}else{map.set(nums[i],i)}}};
链表
1.合并两个有序链表【easy】

/*突破点:递归,4种情况判断解法:1. 判断任一链表是否为空2. 判断1和L2的值谁大*/var MergeLinkList = function(l1,l2){//1.判断任一链表是否为空if(l1 === null ) return l2else if(l2 === null) return l1//判断1和L2的值谁大else if(l1.val < l2.val){l1.next = MergeLinkList(l1.next,l2)return l1}else{l2.next = MergeLinkList(l2.next,l1)return l2}}
2.判断链表中是否有环【easy】

解决方案:用快慢指针
步骤:
- 判断头结点是否为空
- 定义快慢指针
- while迭代循环,循环外都是true,循环内都是false
每当慢指针 slow 前进一步,快指针 fast 就前进两步。
如果 fast 最终遇到空指针,说明链表中没有环;如果 fast 最终和 slow 相遇,那肯定是 fast 超过了 slow 一圈,说明链表中含有环。
var hasCycrl = function(head){if(head ===null || head.next ===null) return falsevar slow = head,fast = head.next;while(slow !== fast){if(fast === null || fast.next === null) return falseslow = slow.nextfast = fast.next.next}return true}
3. 相交链表【easy】
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

/*** Definition for singly-linked list.* function ListNode(val) {* this.val = val;* this.next = null;* }*//*** @param {ListNode} headA* @param {ListNode} headB* @return {ListNode}*///使用set结构存储遍历过的节点,//1.遍历A链,然后把遍历过的值加到temp集合中,然后继续遍历//2.遍历B链,然后遍历到每个节点判断是否在集合中存在,如果存在则该节点就是该节点,继续遍历//3.如果不存在即为空var getIntersectionNode = function(headA, headB) {var visited = new Set()let temp = headA;while(temp !== null ){visited.add(temp)temp = temp.next}temp = headBwhile(temp !== null){if(visited.has(temp)){return temp}temp = temp.next}return null};
