MergeSortedArray,合并两个有序的数组

问题描述:You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.

算法分析:合并两个数组,但是合并后的数组是原来的数组1,不能新建空间,假设数组1有足够的空间,从后往前遍历,避免覆盖问题。同类问题还有合并两个有序的链表,链表和数组的问题都相似。

//从后往前遍历比较,不会遇到覆盖的问题
public class MergeSortedArray
{
	public void merge(int[] nums1, int m, int[] nums2, int n)
	{
		int i = m-1, j = n-1;
		int z = m+n-1;
        while(i >= 0 && j >= 0)
        {
        	if(nums1[i] > nums2[j])
        	{
        		nums1[z--] = nums1[i--];
        	}
        	else
        	{
        		nums1[z--] = nums2[j--];
        	}
        }
        if(i < 0)
        {
        	for(int k = j; k >= 0; k --)
        	{
        		nums1[z--] = nums2[k];
        	}
        }
    }
}

合并两个有序链表:

public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dumy = new ListNode(0);
        ListNode head = dumy;
        while(l1 != null && l2 != null)
        {
            if(l1.val < l2.val)
            {
                dumy.next = l1;
                l1 = l1.next;
            }
            else
            {
                dumy.next = l2;
                l2 = l2.next;
            }
            dumy = dumy.next;
        }
        if(l1 == null)
        {
            dumy.next = l2;
        }
        if(l2 == null)
        {
            dumy.next = l1;
        }
        return head.next;
    }
}
时间: 2024-10-12 22:41:25

MergeSortedArray,合并两个有序的数组的相关文章

merge-sorted-array——合并两个有序数组

Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assume that A has enough space to hold additional elements from B. The number of elements initialized in A and B are m and n respectively. 归并排序 1 class Solutio

经典算法学习——合并两个有序链表

类似的,合并两个有序的数组或者链表也是剑指Offer中的经典题型.题目描述如下:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的.我这里以合并链表来实现. 在这里,并不需要去创建一个新的链表,只要有三个节点指针就行,第一个节点指针Node1指向第一个链表,第二个节点指针Node2指向第二个链表,第三个节点指针Node3指向新的链表.简单的示意图如下: 当下一个节点在第一个链表中时,Node3指向该节点,Node1++,以此类推.直到某一个链表为空时,把另一个链表全部接

合并两个有序链表(java实现)

题目: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4看到这个题,让我想起上次写的博客,合并两个有序的数组.这个题,是链表的合并,这就比较好移动,可以用递归实现链表的拼接所以,代码如下: /** * Definition for singly-linked list. * public class ListNode {

合并两个有序数组

思路: 跟替换字符串中的空格一样,都是从后往前遍历.因为从前往后遍历的话,元素需要移动的次数较多. 示意图: 代码: /****************************************** 两个有序数组的合并 by Rowandjj 2014/7/16 ******************************************/ #include<iostream> using namespace std; #define MAX 1024 //合并有序数组a与有序数

小算法:合并两个有序数组,合并之后仍然有序

1 /** 2 * 合并两个有序数组,合并后仍然有序 3 * @param a 要合并的数组A 4 * @param b 要合并的数组B 5 * @param c 合并后的数组C 6 */ 7 public static void merge(int a[] ,int b[],int c[]){ 8 int lengthA = a.length; 9 int lengthB = b.length; 10 11 int indexA = 0; 12 int indexB = 0; 13 int i

合并两个有序数组a和b到c

1 // 合并两个有序数组a和b到c 2 void Merge_Array(int a[], int n, int b[], int m, int c[]) 3 { 4 int i, j, k; 5 i = j = k = 0; 6 while(i < n && j < m) 7 { 8 if(a[i] < b[j]) 9 c[k++] = a[i++]; 10 else 11 c[k++] = b[j++]; 12 } 13 while(i < n) 14 c[k

leetcode 合并两个有序数组

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: - 初始化 nums1 和 nums2 的元素数量分别为 m 和 n. - 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素. 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6] /** * @param {nu

[leetcode] 88. 合并两个有序数组

88. 合并两个有序数组 水题,没有在原数组上做,偷了个懒 class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int[] ans = new int[m + n]; int i = 0, j = 0; int top = 0; while (i < m && j < n) { if (nums1[i] < nums2[j]) { ans[top++] = nums1[i

领扣(LeetCode)合并两个有序数组 个人题解

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n. 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素. 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6] 这道题,第一想法是动态插入,但是种种错误