第三题 从尾打印链表
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
方法一: 栈方法 push() + reverse()
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function printListFromTailToHead(head)
{
// write code here
var currentNode = this.head;
var arrayList = [];
while (currentNode != null){
arrayList.push(currentNode.val);
currentNode = currentNode.next;
}
return arrayList.reverse();
}
运行时间:15ms,占用内存:5312k
方法二: 队列方法 unshift();
function printListFromTailToHead(head)
{
// write code here
var currentNode = this.head;
var arrayList = [];
while (currentNode != null){
arrayList.unshift(currentNode.val);
currentNode = currentNode.next;
}
return arrayList;
}
运行时间:12ms,占用内存:5908k
第四题 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:前序遍历的第一个是根节点,在中序遍历中找到这个根节点的位置,则在这个跟节点前面的是这个根节点的左子树,在这个根节点后面的是这个根节点的右子树,将左右子树递归下去,就可以得到这个二叉树。
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function reConstructBinaryTree(pre, vin)
{
// write code here
if(pre.length == 0) return;
else if(pre.length == 1) { //对1做判断可以减少运行时间
var node = new TreeNode(pre[0]);
}
else{
var index = vin.indexOf(pre[0]);
var node = new TreeNode(pre[0]);
node.left = reConstructBinaryTree(pre.slice(1,index+1),vin.slice(0,index));
node.right = reConstructBinaryTree(pre.slice(index+1),vin.slice(index+1));
}
return node;
}
运行时间:26ms,占用内存:6576k
第五题 用两个栈实现一个队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路:栈是先进后出(队尾是出入口),队列是先进先出(两个出口,像我们排队一样)。所以push()方法是一样的,关键在pop()。我们可以把栈1的数据拿出来,放进栈2。那么先进栈1的就会最后从栈1出来,到栈2的尾端。这时候我们再从栈2取出来,也就是最先取出之前先进栈1的。相当于利用栈2进行一个倒置。
var stack1 = [];
var stack2 = [];
function push(node)
{
// write code here
stack1.push(node);
}
function pop()
{
// write code here
if (stack2.length === 0){
if(stack1.length === 0){
return null;
}
while(stack1.length !== 0){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
运行时间:13ms,占用内存:5440k