Merge Sorted Lists and Merge Sorted Arrays

本文介绍两种数据结构上的合并操作:一是合并两个有序链表为一个新链表;二是将一个有序数组合并到另一个已预留足够空间的有序数组中。通过具体的代码实现展示了不同数据结构下合并操作的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题描述:

Merge two sorted lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

分析: 这个问题是让操作两个有序的链表,由于操作链表其实就是改变节点之间的指针的指向,所以直接按要求修改节点之间的指针就好了,废话不多说了,直接上代码

    /**
        * Definiton for single-linked list.
        * public class ListNode{
                * int val;
                * ListNode next;
                * ListNode(int x){ val = x ; }
                * }
    */
    public class Solution{
        public ListNode mergeTwoSortedLists(ListNode l1, ListNode l2){
            ListNode head = new ListNode(0);
            ListNode temp = head;
            while(l1 != null && l2 != null){
                if(l1.val < l2.val){
                    temp.next = l1;
                    l1 = l1.next;
                }else{
                    temp.next = l2;
                    l2 = l2.next;
                }
                temp = temp.next;
            }
            temp.next = (l1 !=null)? l1: l2;
            return head.next;
        }
    }

2 问题描述:

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

note: 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.

分析:这个题是让合并两个有序的数组,由于数组的存储结构,我们这里处理是有点特点的,如果结果可以新建立一个数组存,这样子就可以从前面两两比较了,但是这里要求我们把结果放在nums1 里面,这样子如果从开头来比较结果的位置为覆盖后面的数据,如果不想被覆盖,每一次nums1 就要移动,随着结果越加越多,每次移动的元素增加。所以我们这里采用了从两个数组的后面依次比较,这样子就很好的记录了结果而且避免了移动元素。

好了代码如下:

        public class Solution{
        public void mergeTwoSortedArrays(int[] nums1, int m, int[] nums2, int n){
            while(m > 0 && n > 0){
                if(nums1[m-1] > nums2[n-1]){
                    nums1[m+n-1] = nums1[m-1];
                    m--;
                }else{
                    nums1[n+m-1] = nums2[n-1];
                    n--;
                }
            }
            while(n > 0){
                nums1[n-1] = nums2[n-1];
                n--;
            }   
        }
    }

这里不用考虑m的原因是如果在上面的while(m>0 && n>0) 是因为m 退出的那就说明nums2[] 已经处理完了,剩下的元素由于原来就是有序的,继续保持原来的位置就好了。

在Java中,要合并两个有序列表,可以创建一个新的列表,然后遍历每个源列表,依次添加元素到新列表中。这里我们可以使用ArrayList作为容器,因为它支持动态扩容。以下是`mergeSortedLists`方法的实现: ```java import java.util.ArrayList; import java.util.List; public class ListMerger { public static <T extends Comparable<T>> List<T> mergeSortedLists(List<T> list1, List<T> list2) { if (list1 == null || list1.isEmpty()) return list2; if (list2 == null || list2.isEmpty()) return list1; ArrayList<T> mergedList = new ArrayList<>(list1); int i = 0, j = 0; while (i < list1.size() && j < list2.size()) { if (list1.get(i).compareTo(list2.get(j)) <= 0) { mergedList.add(list1.get(i)); i++; } else { mergedList.add(list2.get(j)); j++; } } // 如果list1还有剩余元素没加,直接追加 while (i < list1.size()) { mergedList.add(list1.get(i)); i++; } // 如果list2还有剩余元素没加,也追加 while (j < list2.size()) { mergedList.add(list2.get(j)); j++; } return mergedList; } } ``` 为了测试这个方法,你可以创建一个简单的主程序: ```java import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> list1 = Arrays.asList(1, 3, 5, 7); List<Integer> list2 = Arrays.asList(2, 4, 6, 8); List<Integer> mergedList = ListMerger.mergeSortedLists(list1, list2); System.out.println("Merged sorted list: " + mergedList); } } ``` 当你运行这段代码时,它会输出合并后的有序列表 `[1, 2, 3, 4, 5, 6, 7, 8]`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值