Enhance docs, remove main, add tests in `MergeSortedArray… (#5996)

This commit is contained in:
Hardik Pawar
2024-10-25 20:03:40 +05:30
committed by GitHub
parent fed2d4b5ef
commit c8e9e748b2
3 changed files with 136 additions and 31 deletions

View File

@ -1,49 +1,55 @@
package com.thealgorithms.datastructures.lists;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Utility class for merging two sorted ArrayLists of integers into a single sorted collection.
*
* <p>This class provides a static `merge` method to combine two pre-sorted lists of integers into a
* single sorted list. It does so without modifying the input lists by adding elements from both lists in sorted order
* into the result list.</p>
*
* <p>Example usage:</p>
* <pre>
* List<Integer> listA = Arrays.asList(1, 3, 5, 7, 9);
* List<Integer> listB = Arrays.asList(2, 4, 6, 8, 10);
* List<Integer> result = new ArrayList<>();
* MergeSortedArrayList.merge(listA, listB, result);
* </pre>
*
* <p>The resulting `result` list will be [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].</p>
*
* <p>Note: This class cannot be instantiated as it is designed to be used only with its static `merge` method.</p>
*
* <p>This implementation assumes the input lists are already sorted in ascending order.</p>
*
* @author https://github.com/shellhub
* @see List
*/
public final class MergeSortedArrayList {
private MergeSortedArrayList() {
}
public static void main(String[] args) {
List<Integer> listA = new ArrayList<>();
List<Integer> listB = new ArrayList<>();
List<Integer> listC = new ArrayList<>();
/* init ListA and List B */
for (int i = 1; i <= 10; i += 2) {
listA.add(i);
/* listA: [1, 3, 5, 7, 9] */
listB.add(i + 1);
/* listB: [2, 4, 6, 8, 10] */
}
/* merge listA and listB to listC */
merge(listA, listB, listC);
System.out.println("listA: " + listA);
System.out.println("listB: " + listB);
System.out.println("listC: " + listC);
}
/**
* merge two sorted ArrayList
* Merges two sorted lists of integers into a single sorted collection.
*
* @param listA the first list to merge
* @param listB the second list to merge
* @param listC the result list after merging
* <p>This method does not alter the original lists (`listA` and `listB`). Instead, it inserts elements from both
* lists into `listC` in a way that maintains ascending order.</p>
*
* @param listA The first sorted list of integers.
* @param listB The second sorted list of integers.
* @param listC The collection to hold the merged result, maintaining sorted order.
* @throws NullPointerException if any of the input lists or result collection is null.
*/
public static void merge(List<Integer> listA, List<Integer> listB, Collection<Integer> listC) {
if (listA == null || listB == null || listC == null) {
throw new NullPointerException("Input lists and result collection must not be null.");
}
int pa = 0;
/* the index of listA */
int pb = 0;
/* the index of listB */
while (pa < listA.size() && pb < listB.size()) {
if (listA.get(pa) <= listB.get(pb)) {
@ -53,12 +59,11 @@ public final class MergeSortedArrayList {
}
}
/* copy left element of listA to listC */
// Add remaining elements from listA, if any
while (pa < listA.size()) {
listC.add(listA.get(pa++));
}
/* copy left element of listB to listC */
// Add remaining elements from listB, if any
while (pb < listB.size()) {
listC.add(listB.get(pb++));
}