Javascript实现两个有序数组合并为新的有序数组

  • Post author:
  • Post category:java


给定两个升序排列的数字数组合并成一个新的升序排列的数字数组。

一、简单版本。

思路:先将两个数组进行合并,然后再进行升序排列

实现:

function merge(arr: number[], arr1: number[]) {
	if (!Array.isArray(arr) || !Array.isArray(arr1)) {
		return []
	}
	const data = arr.concat(arr1)
	data.sort((a, b) => a - b)
	return data
}

优点:思路清晰、代码简单;

二、进阶版本

思路:两个有序数组看成放两排的数字,两排数组各有一个指针,比较两个指针对应位置的元素大小,哪个指针对应的元素小,则把此元素推入返回数组,同时此指针后移一位,如果两个元素相等则两个元素同时推入返回数组,并且两个指针同时往后移一位,如此循环往复,两个指针依次往后推移,当两个数组的指针同时指到数组最后一位加1的时候停止,或者其中一个指针已经到达最后一位加1的时候停止,并且把另一个数组指针后面的元素推入返回数组。

实现:

function merge(arr: number[], arr1: number[]) {
	if (!Array.isArray(arr) || !Array.isArray(arr1)) {
		return []
	}
	if (arr.length === 0) {
		return arr1
	}
	if (arr1.length === 0) {
		return arr
	}
	let firstIndex = 0
	let secondIndex = 0
	const data: number[] = []
	for (let i = 0; i < arr.length + arr1.length; i++) {
		if (arr[firstIndex] > arr1[secondIndex]) {
			data.push(arr1[secondIndex])
			secondIndex += 1
		} else if (arr[firstIndex] < arr1[secondIndex]) {
			data.push(arr[firstIndex])
			firstIndex += 1
		} else if (arr[firstIndex] === arr1[secondIndex]) {
			data.push(arr[firstIndex])
			data.push(arr1[secondIndex])
			secondIndex += 1
			firstIndex += 1	
		}
		if (secondIndex === arr1.length && firstIndex < arr.length) {
			data.push(...arr.slice(firstIndex))
			break
		}
		if (firstIndex === arr.length && secondIndex < arr1.length) {
			data.push(...arr1.slice(secondIndex))
			break
		}
		if (firstIndex === arr.length && secondIndex === arr1.length) {
			break
		}
	}
	return data
}

优点:复杂度低,时间复杂度O(n)



版权声明:本文为qqq1130258758原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。