合并两个有序数组

在这里插入图片描述

​ 将两个升序链表合并成一个升序链表, 首先我们想, 不管怎么样, 我们都需要将两个链表的每一个元素都操作到, 也就说时间复杂度最小是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;
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值