链表刷题记录

Date:

链表刷题记录


707. 设计链表

  • 描述:实现链表的基本操作,必做题
  • 注意:其实没啥,主要是有很多边界情况要多次提交,哪里错补哪里

83.删除排序链表中的重复元素

  • 描述: 链表[1,1,2] -> [1,2]
  • 注意:一旦遇到下一个和下下个值一样,那就跳过下下个,直接指向下下下…

82.删除排序链表中的重复元素II

  • 描述: 链表[1,1,2] -> [2]
  • 注意:一旦遇到下一个和下下个值一样,那就一直删除到不一样为止

206.反转链表

  • 描述:整个链表反转[1,2,3,4,5] -> [5,4,3,2,1]
  • 实现:pre=null, cur=head,然后一个个逆向
  • nxt = cur.next cur.next = pre pre = cur cur = nxt

92.反转链表II

  • 描述:反转部分链表[1,2,3,4,5] -> [1,4,3,2,5]
  • 实现:找反转区域,区域内以206的思路反转
  • 注意:最后拼接最好画个图 allPreNode.next.next = allEndNode allPreNode.next = pre

141.环形链表

  • 描述:判断链表是否有环
  • 实现:快慢指针,快指针走两步,慢指针走一步 while(fast&&fast.next){...} 无环会跳出,有环相遇判断跳出

142.环形链表II

  • 描述:判断并返回环形链表的入口节点
  • 实现:在141的基础上,从相遇点开始,再派一个指针从头出发,和慢指针同时出发,他俩相遇点就是入口 环形链表入口

19.删除链表的倒数第N个节点

  • 快慢指针,注意索引

876.链表的中间节点

  • 快慢指针,注意索引

2.两数相加

  • 描述:这种题目都不可能转为number再相加,只能按digit相加进位
  • 实现:两个链表同时遍历,注意进位的处理,外置一个carry变量,每次都更新
      let cur1 = l1, cur2 = l2
      let head = new ListNode(-1)
      let cur = head
      let carry = 0 // 进位 !
    
      while (cur1 || cur2 || carry) {
    
          // 算好digit和carry
          const val1 = cur1 ? cur1.val : 0
          const val2 = cur2 ? cur2.val : 0
          const sum = val1 + val2 + carry
          carry = sum / 10 | 0
          const digit = sum % 10
    
          cur.next = new ListNode(digit)
          cur = cur.next
    
          if (cur1) cur1 = cur1.next
          if (cur2) cur2 = cur2.next
      }
    
      return head.next