将两个升序链表合并成一个升序链表, 首先我们想, 不管怎么样, 我们都需要将两个链表的每一个元素都操作到, 也就说时间复杂度最小是O(n)。
首先看到这个题目, 脑中想出一种思路, 两种实现方案。
第一种方案:
1. 首先拿一个数组作为基数组(往这个数组中插入值, 并且将这个数组返回), 假设为l1;
2. 假设l1 为空数组, 那么直接返回l2数组, 否则,遍历l2数组, 和l1数组值做比较,如果l2中某元素的值小于l1中对应位置的值, 那么插入l1.
3. 直到, l1 数组中的值变成undefined 或者, l2数组遍历完毕, 此时说明至少有一个数组是被找完了的。
l2 1 3 4
l1 1 2 4
l1 1(l2) 1 2 4 // 首先l2第一位的元素小于等于l1中第一位的元素, 那么将l2第一位的元素插入到l1中第一个位置, l2中指针加1,l1中指针也加1
l1 1(l2) 1 2 3 4 // l2 中第二位的元素大于l1中此时第二个元素,那么l1指针加1,再比较,l2第二个元素还是大,l1指针再加, 直到l1中指针指 到4的位置, 大于l2中的3, 将3插入到l1中原本4的位置
l1 1(l2) 1 2 3 4(l2) 4 // l2中最后一个元素等于l1中最后一个元素, 那么直接插入到4的位置, l1中元素后移,此时l2遍历完毕, 将l1返回
代码如下:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} list1
* @param {ListNode} list2
* @return {ListNode}
*/
var mergeTwoLists = function(list1, list2) {
// 使用l1 作为 基数组
// 首先判断l1的长度是否为0, 直接返回l2. 反之亦然
if (list1.length === 0) return list2;
if (list2.length === 0) return list1;
let i = 0;
let j = 0;
while(list1[i] !== undefined && list2[j] !== undefined) { // 如果满足l1[i] 不是undefined的情况下就说明l1还没有遍历完
// 如果 l1[i] < l2[j]
if (list1[i] < list2[j]) {
i++;
} else {
// 如果l2[i] > l1[i]
// 首先, 将l2[j] 的值插入到 l1[i] 的位置,
list1.splice(i, 0, list2[j]);
j++; // 下次拿 j 的后一个元素和 l1[i + 1] 对比, 所以 j++
i++;
}
}
// 假设list2[j] 的值不是 undefined
// 那么说明 j 后面的元素都大于list1中所有的元素, 此时直接将list2中的元素插入到list1的最后面就好
if (list2[j] !== undefined) {
list1.push(list2.slice(j));
}
return list1;
};