这里的表可以是数组或者是链表等,并且已经从小到大排好顺序,我们的任务就是将这两个表合并成一个表。
首先,如果给定的表是两个链表,最简便的方法就是用递归的办法:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null) return l2;
if(l2 == null) return l1;
if(l1.val <= l2.val) {
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}
else {
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
}
再者,如果给定的是两个已排序的数组nums1,nums2,并且每个数组的长度m,n也已经给定,且nums1数组中有足够的空间可以容纳合并后的数组,则有一个比较经济实惠的办法完成这个任务:
public class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1, j = n -1, k = m + n -1;
while(i>=0&&j>=0){
if(nums1[i]>= nums2[j]){
nums1[k--] = nums1[i--];
}
else {
nums1[k--] = nums2[j--];
}
}
while(j>=0) nums1[k--] = nums2[j--];
}
}
在这里需要注意两个数组的初始长度,如果其中一个的初始长度是0就会导致无法进入主循环,合并失败,好在我们是在nums1的原址上合并的,所以n==0的情况不会很糟,主要要考虑m==0的情况,这时候需要把nums2整个复制到nums1中。
该问题来自LeetCode OJ