题目:合并联两个排序的列表
描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0 \le n \le 10000≤n≤1000,-1000 \le 节点值 \le 1000−1000≤节点值≤1000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6}
解题思路:
采用的递归的思路,{1,3,5},{2,4,6}这个例子中,1和2对比,1比较小,所以是第二个链表会插入到第一个链表,需要返回第一个链表,但是在返回之前需要看3是不是比2大,才能确认插入的位置
代码
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list2==null)return list1;
if(list1==null)return list2;
if(list2.val > list1.val){
list1.next = Merge(list1.next,list2);
return list1;
}
else{
list2.next = Merge(list1,list2.next);
return list2;
}
}
}
合并两个有序的数组
描述
给出一个有序的整数数组 A 和有序的整数数组 B ,请将数组 B 合并到数组 A 中,变成一个有序的升序数组
注意:
1.保证 A 数组有足够的空间存放 B 数组的元素, A 和 B 中初始的元素数目分别为 m 和 n,A的数组空间大小为 m+n
2.不要返回合并的数组,将数组 B 的数据合并到 A 里面就好了,且后台会自动将合并后的数组 A 的内容打印出来,所以也不需要自己打印
3. A 数组在[0,m-1]的范围也是有序的
输入:
[4,5,6],[1,2,3]
返回值:
[1,2,3,4,5,6]
说明:
A数组为[4,5,6],B数组为[1,2,3],后台程序会预先将A扩容为[4,5,6,0,0,0],B还是为[1,2,3],m=3,n=3,传入到函数merge里面,然后请同学完成merge函数,将B的数据合并A里面,最后后台程序输出A数组
思路:采用双指针的思路,新建一个新的数组,然后A和B 中的值一一对比,其中比较小的值填入新数组中
代码:
public class Solution {
public void merge(int A[], int m, int B[], int n) {
int[] r = new int[m+n];
int a=0;
int b=0;
while(a<m && b<n ){
if(A[a]<=B[b]){
r[a+b]=A[a]; //如果A的值小于等于B的值,则取A的值放入新数组中
a++;
}
else{
r[a+b]=B[b]; //如果A的值大于B的值,则取B的值放入新数组中
b++;
}
} //循环结束,说明A或B,有一个数组的值已经遍历完了
if(a!=m){ //如果B 已经遍历完了
for(int i=a;i!=m;i++){
r[i+n]=A[i];
}
}
if(b!=n){ //如果A已经遍历完了
for(int i=b;i!=n;i++){
r[i+m]=B[i];
}
}
for(int i=0;i!=m+n;i++){ // 把新数组赋值给A,因为题目要求返回A
A[i]=r[i];
}
}
}
ps: 这里只是一种解法,还有从后面开始遍历的解法,或者更多,有空补上。