力扣第21、102题

21.合并两个有序链表

image.png
心得:链表遍历有两种,带头节点的、不带头节点的

  1. //带头节点
  2. while(p.next){
  3. doSomething(p.next)
  4. p = p.next
  5. }
  6. //好处就是能访问的上一个节点(父节点)
  7. //不带头节点
  8. while(p){
  9. doSomething(p)
  10. p = p.next
  11. }
  12. //不能访问上一个节点(父节点)
  13. //扩展(爷节点)
  14. while(p.next.next){
  15. doSomething(p.next.next)
  16. p = p.next
  17. }
  18. //能访问到父、爷节点
  19. //扩展2(遍历两个节点)
  20. while(p1&&p2){
  21. doSomething(p1)
  22. doSomething(p2)
  23. p1 = p1.next
  24. p2 = p2.next
  25. }
  26. //同时遍历两个链表

实现代码

  1. var mergeTwoLists = function(list1, list2) {
  2. let preHade = p = new ListNode()
  3. while(list1&&list2){
  4. //比较值的大小,小的串上去
  5. if(list1.val<list2.val){
  6. p.next = list1;
  7. list1=list1.next;
  8. }else{
  9. p.next = list2;
  10. list2=list2.next
  11. }
  12. p=p.next
  13. }
  14. //上面遍历完了就有一个没了,剩下的一个直接串上去
  15. p.next = list1||list2;
  16. return preHade.next;
  17. //返回一个不带头节点的链表
  18. };

102.二叉树的层序遍历

image.png
bfs 队列

  1. function levelOrder(root) {
  2. if (!root) return [];
  3. const res = [];
  4. const queue = [root];
  5. while (queue.length) {
  6. const levelSize = queue.length;
  7. const level = [];
  8. for (let i = 0; i < levelSize; i++) {
  9. const n = queue.shift();
  10. level.push(n.val);
  11. n.left && queue.push(n.left);
  12. n.right && queue.push(n.right);
  13. }
  14. res.push(level);
  15. }
  16. return res;
  17. };