数组

两数之和

image.png

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

链表

1.合并两个有序链表【easy】

image.png

  1. /*突破点:递归,4种情况判断
  2. 解法:
  3. 1. 判断任一链表是否为空
  4. 2. 判断1和L2的值谁大*/
  5. var MergeLinkList = function(l1,l2){
  6. //1.判断任一链表是否为空
  7. if(l1 === null ) return l2
  8. else if(l2 === null) return l1
  9. //判断1和L2的值谁大
  10. else if(l1.val < l2.val){
  11. l1.next = MergeLinkList(l1.next,l2)
  12. return l1
  13. }
  14. else{
  15. l2.next = MergeLinkList(l2.next,l1)
  16. return l2
  17. }
  18. }

2.判断链表中是否有环【easy】

image.png
解决方案:用快慢指针
步骤:

  1. 判断头结点是否为空
  2. 定义快慢指针
  3. while迭代循环,循环外都是true,循环内都是false

每当慢指针 slow 前进一步,快指针 fast 就前进两步。
如果 fast 最终遇到空指针,说明链表中没有环;如果 fast 最终和 slow 相遇,那肯定是 fast 超过了 slow 一圈,说明链表中含有环。

  1. var hasCycrl = function(head){
  2. if(head ===null || head.next ===null) return false
  3. var slow = head,fast = head.next;
  4. while(slow !== fast){
  5. if(fast === null || fast.next === null) return false
  6. slow = slow.next
  7. fast = fast.next.next
  8. }
  9. return true
  10. }

3. 相交链表【easy】

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
image.pngimage.png

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} headA
  10. * @param {ListNode} headB
  11. * @return {ListNode}
  12. */
  13. //使用set结构存储遍历过的节点,
  14. //1.遍历A链,然后把遍历过的值加到temp集合中,然后继续遍历
  15. //2.遍历B链,然后遍历到每个节点判断是否在集合中存在,如果存在则该节点就是该节点,继续遍历
  16. //3.如果不存在即为空
  17. var getIntersectionNode = function(headA, headB) {
  18. var visited = new Set()
  19. let temp = headA;
  20. while(temp !== null ){
  21. visited.add(temp)
  22. temp = temp.next
  23. }
  24. temp = headB
  25. while(temp !== null){
  26. if(visited.has(temp)){
  27. return temp
  28. }
  29. temp = temp.next
  30. }
  31. return null
  32. };

4. 链表的中间结点 【easy】

4.合并K个升序链表【hard】

单链表的倒数第-k-个节点