(0628算法题)合并有序链表、二叉树中序遍历

93 阅读1分钟

一、合并两个有序链表

主要考察的是,指针与内存的关系

合并有序链表.png

原理:

  1. prehead一直指向这个内存起始位置
  2. prev一直往后指,为了让这个链表串起来
  3. 在内存里,这个-1节点的下一个节点就是链表第一个节点
  4. prehead是去找节点的,实际上内存里边已经串起来了
  5. 所以,最后返回prehead.next
var mergeTwoLists = function(list1, list2) {
	// 定义一个哨兵节点-1,prehead是一个引用,指向new的这一块内存
    const prehead = new ListNode(-1);
    // 再定义一个prev=prehead,就是指向了同一块内存
    let prev = prehead;
	// prehead一直没变,prev向后一个一个新增节点
	// prev指向下一个更小的值,并移动到新链表这个值上
	
    while(list1 !== null && list2 !== null){
        if(list1.val <= list2.val){
            prev.next = list1;
            list1 = list1.next;
        }else{
            prev.next = list2;
            list2= list2.next;
        }
        prev = prev.next;
    }

    if(list1 !== null){
        prev.next = list1;
    }
    if(list2 !== null){
        prev.next = list2;
    }

    return prehead.next;
};

二、二叉树中序遍历

原理:

  1. 中序遍历:左-根-右
  2. 用递归模拟该过程,一直找left,直到它没有left,就push进res,然后递归right,此时的right节点再去找left,无限套娃
var inorderTraversal = function(root) {
    const res = [];
    const inorder = function(root){

        if(!root){
            return;
        }
        inorder(root.left);
        res.push(root.val);
        inorder(root.right);
    }

    inorder(root);
    return res;
};