一、合并有序数组元素,合并后保持有序,时间复杂度要求O(n)
例如:给定的两个数组为[1, 5]和[2, 5, 6, 8], 函数返回[1, 2, 5, 6, 8]
答案:
function sort(arr1, arr2) {
var [i, j] = [0, 0];
let newArr = [];
while (i < arr1.length || j < arr2.length) {
if (arr1[i] < arr2[j]) {
newArr.push(arr1[i]);
i++;
} else if (arr1[i] > arr2[j]) {
newArr.push(arr2[j]);
j++;
} else {
if (arr1[i]) newArr.push(arr1[i]);
if (arr2[j]) newArr.push(arr2[j]);
i++;
j++;
}
}
return newArr;
}
二、判断一个dom节点是否为另一个dom节点的祖先
答案:
function isChild(child, parent) {
let p = child.parentNode;
while(true) {
if (!p) return false;
if (p === parent) return true;
p = p.parentNode;
}
}
三、反转单链表
LeetCode连接:算法反转单链表
使用递归的方式。
优势:
借用JS强大的闭包功能
只需遍历一遍链表
缺点:
递归的缺点:占空间
思路:
递归的基线条件:遍历到末节点(node.next === null)
递归的递归条件:node.next !== null
当遇到末节点时,返回末节点,前一节点接收末节点,并把末节点的next设置为自身,返回前一节的,继续下去
考虑特殊情况:undefined和null
答案:在这里插入代码片
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function (head) {
// 闭包
if (head === undefined || head === null) return null
var originalHead = head
var reverseHead
var reverse = function (head) {
if (head.next === null) {
reverseHead = head
return head
} else {
var node = reverse(head.next)
node.next = head
if (originalHead === head) {
head.next = null
return reverseHead
} else {
return head
}
}
}
return reverse(head)
};
四、交错合并数组元素
例如:给定的两个数组为[‘a’, ‘B’]和[1,2,3],函数返回[‘a’, 1, ‘B’,2, 3]
答案:
function jchb (arr1, arr2) {
const maxLength = arr1.length > arr2.length ? arr1.length : arr2.length ;
const arr = new Array();
arr[0] = arr1;
arr[1] = arr2;
const arrResult = new Array();
let intRstIdx = 0;
for (var i = 0; i < maxLength; i++) {
// 按照需要交错合并的两个数组循环
for (var j = 0; j < arr.length; j++) {
//如果这个数组还有值,就交错合并
if (arr[j].length > i) {
arrResult[intRstIdx] = arr[j][i];
intRstIdx++;
}
}
}
return arrResult;
}