一、合并两个有序链表
主要考察的是,指针与内存的关系
原理:
- prehead一直指向这个内存起始位置
- prev一直往后指,为了让这个链表串起来
- 在内存里,这个-1节点的下一个节点就是链表第一个节点
- prehead是去找节点的,实际上内存里边已经串起来了
- 所以,最后返回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;
};
二、二叉树中序遍历
原理:
- 中序遍历:左-根-右
- 用递归模拟该过程,一直找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;
};