Skip to content

Commit fed2d4b

Browse files
authored
Enhance docs, remove main, add tests in `MergeSortedSingl… (#5997)
1 parent 6f489e5 commit fed2d4b

File tree

3 files changed

+131
-24
lines changed

3 files changed

+131
-24
lines changed

DIRECTORY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,7 @@
830830
* lists
831831
* [CircleLinkedListTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/lists/CircleLinkedListTest.java)
832832
* [CreateAndDetectLoopTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/lists/CreateAndDetectLoopTest.java)
833+
* [MergeSortedSinglyLinkedListTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/lists/MergeSortedSinglyLinkedListTest.java)
833834
* [QuickSortLinkedListTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/lists/QuickSortLinkedListTest.java)
834835
* [ReverseKGroupTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/lists/ReverseKGroupTest.java)
835836
* [RotateSinglyLinkedListsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/datastructures/lists/RotateSinglyLinkedListsTest.java)
Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,49 @@
11
package com.thealgorithms.datastructures.lists;
22

3+
/**
4+
* Utility class for merging two sorted singly linked lists.
5+
*
6+
* <p>This class extends the {@link SinglyLinkedList} class to support the merging of two sorted linked lists.
7+
* It provides a static method, `merge`, that takes two sorted singly linked lists, merges them into a single sorted linked list,
8+
* and returns the result.</p>
9+
*
10+
* <p>Example usage:</p>
11+
* <pre>
12+
* SinglyLinkedList listA = new SinglyLinkedList();
13+
* SinglyLinkedList listB = new SinglyLinkedList();
14+
* for (int i = 2; i <= 10; i += 2) {
15+
* listA.insert(i); // listA: 2->4->6->8->10
16+
* listB.insert(i - 1); // listB: 1->3->5->7->9
17+
* }
18+
* SinglyLinkedList mergedList = MergeSortedSinglyLinkedList.merge(listA, listB);
19+
* System.out.println(mergedList); // Output: 1->2->3->4->5->6->7->8->9->10
20+
* </pre>
21+
*
22+
* <p>The `merge` method assumes that both input lists are already sorted in ascending order.
23+
* It returns a new singly linked list that contains all elements from both lists in sorted order.</p>
24+
*
25+
* @see SinglyLinkedList
26+
*/
327
public class MergeSortedSinglyLinkedList extends SinglyLinkedList {
428

5-
public static void main(String[] args) {
6-
SinglyLinkedList listA = new SinglyLinkedList();
7-
SinglyLinkedList listB = new SinglyLinkedList();
8-
9-
for (int i = 2; i <= 10; i += 2) {
10-
listA.insert(i);
11-
listB.insert(i - 1);
12-
}
13-
assert listA.toString().equals("2->4->6->8->10");
14-
assert listB.toString().equals("1->3->5->7->9");
15-
assert merge(listA, listB).toString().equals("1->2->3->4->5->6->7->8->9->10");
16-
}
17-
1829
/**
19-
* Merge two sorted SingleLinkedList
30+
* Merges two sorted singly linked lists into a single sorted singly linked list.
31+
*
32+
* <p>This method does not modify the input lists; instead, it creates a new merged linked list
33+
* containing all elements from both lists in sorted order.</p>
2034
*
21-
* @param listA the first sorted list
22-
* @param listB the second sored list
23-
* @return merged sorted list
35+
* @param listA The first sorted singly linked list.
36+
* @param listB The second sorted singly linked list.
37+
* @return A new singly linked list containing all elements from both lists in sorted order.
38+
* @throws NullPointerException if either input list is null.
2439
*/
2540
public static SinglyLinkedList merge(SinglyLinkedList listA, SinglyLinkedList listB) {
41+
if (listA == null || listB == null) {
42+
throw new NullPointerException("Input lists must not be null.");
43+
}
44+
2645
Node headA = listA.getHead();
2746
Node headB = listB.getHead();
28-
2947
int size = listA.size() + listB.size();
3048

3149
Node head = new Node();
@@ -40,12 +58,10 @@ public static SinglyLinkedList merge(SinglyLinkedList listA, SinglyLinkedList li
4058
}
4159
tail = tail.next;
4260
}
43-
if (headA == null) {
44-
tail.next = headB;
45-
}
46-
if (headB == null) {
47-
tail.next = headA;
48-
}
61+
62+
// Attach remaining nodes
63+
tail.next = (headA == null) ? headB : headA;
64+
4965
return new SinglyLinkedList(head.next, size);
5066
}
5167
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.thealgorithms.datastructures.lists;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
6+
import org.junit.jupiter.api.Test;
7+
8+
class MergeSortedSinglyLinkedListTest {
9+
10+
@Test
11+
void testMergeTwoSortedLists() {
12+
SinglyLinkedList listA = new SinglyLinkedList();
13+
SinglyLinkedList listB = new SinglyLinkedList();
14+
15+
for (int i = 2; i <= 10; i += 2) {
16+
listA.insert(i);
17+
listB.insert(i - 1);
18+
}
19+
20+
SinglyLinkedList mergedList = MergeSortedSinglyLinkedList.merge(listA, listB);
21+
assertEquals("1->2->3->4->5->6->7->8->9->10", mergedList.toString(), "Merged list should contain all elements in sorted order.");
22+
}
23+
24+
@Test
25+
void testMergeWithEmptyListA() {
26+
SinglyLinkedList listA = new SinglyLinkedList(); // Empty listA
27+
SinglyLinkedList listB = new SinglyLinkedList();
28+
listB.insert(1);
29+
listB.insert(3);
30+
listB.insert(5);
31+
32+
SinglyLinkedList mergedList = MergeSortedSinglyLinkedList.merge(listA, listB);
33+
assertEquals("1->3->5", mergedList.toString(), "Merged list should match listB when listA is empty.");
34+
}
35+
36+
@Test
37+
void testMergeWithEmptyListB() {
38+
SinglyLinkedList listA = new SinglyLinkedList();
39+
SinglyLinkedList listB = new SinglyLinkedList(); // Empty listB
40+
listA.insert(2);
41+
listA.insert(4);
42+
listA.insert(6);
43+
44+
SinglyLinkedList mergedList = MergeSortedSinglyLinkedList.merge(listA, listB);
45+
assertEquals("2->4->6", mergedList.toString(), "Merged list should match listA when listB is empty.");
46+
}
47+
48+
@Test
49+
void testMergeWithBothEmptyLists() {
50+
SinglyLinkedList listA = new SinglyLinkedList(); // Empty listA
51+
SinglyLinkedList listB = new SinglyLinkedList(); // Empty listB
52+
53+
SinglyLinkedList mergedList = MergeSortedSinglyLinkedList.merge(listA, listB);
54+
assertEquals("", mergedList.toString(), "Merged list should be empty when both input lists are empty.");
55+
}
56+
57+
@Test
58+
void testMergeWithDuplicateValues() {
59+
SinglyLinkedList listA = new SinglyLinkedList();
60+
SinglyLinkedList listB = new SinglyLinkedList();
61+
62+
listA.insert(1);
63+
listA.insert(3);
64+
listA.insert(5);
65+
listB.insert(1);
66+
listB.insert(4);
67+
listB.insert(5);
68+
69+
SinglyLinkedList mergedList = MergeSortedSinglyLinkedList.merge(listA, listB);
70+
assertEquals("1->1->3->4->5->5", mergedList.toString(), "Merged list should include duplicate values in sorted order.");
71+
}
72+
73+
@Test
74+
void testMergeThrowsExceptionOnNullInput() {
75+
SinglyLinkedList listA = null;
76+
SinglyLinkedList listB = new SinglyLinkedList();
77+
listB.insert(1);
78+
listB.insert(2);
79+
80+
SinglyLinkedList finalListA = listA;
81+
SinglyLinkedList finalListB = listB;
82+
assertThrows(NullPointerException.class, () -> MergeSortedSinglyLinkedList.merge(finalListA, finalListB), "Should throw NullPointerException if listA is null.");
83+
84+
listA = new SinglyLinkedList();
85+
listB = null;
86+
SinglyLinkedList finalListA1 = listA;
87+
SinglyLinkedList finalListB1 = listB;
88+
assertThrows(NullPointerException.class, () -> MergeSortedSinglyLinkedList.merge(finalListA1, finalListB1), "Should throw NullPointerException if listB is null.");
89+
}
90+
}

0 commit comments

Comments
 (0)