|
| 1 | +# [88.合并两个有序数组](https://leetcode-cn.com/problems/merge-sorted-array) |
| 2 | + |
| 3 | + |
| 4 | +### 题目描述 |
| 5 | + |
| 6 | +<div class="notranslate"><p>给你两个有序整数数组 <em>nums1 </em>和 <em>nums2</em>,请你将 <em>nums2 </em>合并到 <em>nums1 </em>中<em>,</em>使 <em>nums1 </em>成为一个有序数组。</p> |
| 7 | + |
| 8 | +<p> </p> |
| 9 | + |
| 10 | +<p><strong>说明:</strong></p> |
| 11 | + |
| 12 | +<ul> |
| 13 | + <li>初始化 <em>nums1</em> 和 <em>nums2</em> 的元素数量分别为 <em>m</em> 和 <em>n </em>。</li> |
| 14 | + <li>你可以假设 <em>nums1 </em>有足够的空间(空间大小大于或等于 <em>m + n</em>)来保存 <em>nums2</em> 中的元素。</li> |
| 15 | +</ul> |
| 16 | + |
| 17 | +<p> </p> |
| 18 | + |
| 19 | +<p><strong>示例:</strong></p> |
| 20 | + |
| 21 | +<pre><strong>输入:</strong> |
| 22 | +nums1 = [1,2,3,0,0,0], m = 3 |
| 23 | +nums2 = [2,5,6], n = 3 |
| 24 | + |
| 25 | +<strong>输出:</strong> [1,2,2,3,5,6]</pre> |
| 26 | +</div> |
| 27 | + |
| 28 | +### 解题思路 |
| 29 | + |
| 30 | +1. 采用双指针分别将两个数组 `nums1` 和数组 `nums2` 从后向前插入到数组 `nums1` 中 |
| 31 | +2. 指针 `i` 标记数组 nums1 当前比较位置,开始位数组元素最后位 |
| 32 | +3. 指针 `j` 标记数组 nums2 当前比较位置,开始位数组元素最后位 |
| 33 | +4. 指针 `k` 表示结果从后向前当前可插入位置,默认 `nums1` 后 `n` 位都是可插入位,将 `nums1` 中元素插入当前可插入位后, 从 指针 `i` 至 `k` 都是可插入位 |
| 34 | +5. 循环将数组 `nums2` 插入到数组 `nums1` |
| 35 | +6. 当数组 `nums1` 当前可比较数据位 `i` 大于等于 0 并且数组 `nums1` 当前位置值比 `nums2` 当前位置值大时,将数组 `nums1` 当前位置数组 插入到 `k` 位置 ,`i` 位指针向前挪一位 |
| 36 | +7. 否则将 `nums2` 当前位置数据插入到 `k` 位置,`j` 位指针向前挪一位 |
| 37 | +8. 插入完成后将当前插入位置指针 `k` 向前挪一位,进行下一次插入 |
| 38 | + |
| 39 | + |
| 40 | + |
| 41 | +### 代码实现 |
| 42 | + |
| 43 | +<!-- tabs:start --> |
| 44 | + |
| 45 | +#### **Golang** |
| 46 | +```go |
| 47 | +func merge(nums1 []int, m int, nums2 []int, n int) { |
| 48 | + var i, j = m - 1, n - 1 |
| 49 | + |
| 50 | + for k := m + n - 1; k >= 0; k-- { |
| 51 | + if j < 0 || (i >= 0 && nums1[i] > nums2[j]) { |
| 52 | + nums1[k] = nums1[i] |
| 53 | + i-- |
| 54 | + } else { |
| 55 | + nums1[k] = nums2[j] |
| 56 | + j-- |
| 57 | + } |
| 58 | + } |
| 59 | +} |
| 60 | +``` |
| 61 | + |
| 62 | + |
| 63 | +<!-- tabs:end --> |
0 commit comments