两道题非常类似,所以总结在一起
21.题目:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
迭代法
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode p = new ListNode(0);
ListNode q = p;
while(l1 != null && l2 != null){
if(l1.val < l2.val){
q.next = l1;
l1 = l1.next;
}else{
q.next = l2;
l2 = l2.next;
}
q = q.next;
}
return p.next;
}
}
递归法
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;
}
}
88.给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
初始化 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]
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p = m + n -1;
int len1= m - 1, len2 = n - 1;
while(len1 >= 0 && len2 >= 0){
if(nums1[len1] > nums2[len2]){
nums1[p--] = nums1[len1--];
}else{
nums1[p--] = nums2[len2--];
}
}
while(len2 >= 0){
nums1[p--] = nums2[len2--];
}
}
}