Skip to content

Commit cc0538d

Browse files
committed
Added 21. Merge Two Sorted Lists
1 parent f8c18c4 commit cc0538d

4 files changed

Lines changed: 142 additions & 46 deletions

File tree

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.dojo.leetcode;
22

3+
import static org.dojo.leetcode.SinglyLinkedList.SinglyLinkedListNode;
4+
35
public class LinkedListProblems {
46
public SinglyLinkedListNode addTwoNumbers(SinglyLinkedListNode l1, SinglyLinkedListNode l2) {
57
var carryover = 0;
@@ -9,21 +11,17 @@ public SinglyLinkedListNode addTwoNumbers(SinglyLinkedListNode l1, SinglyLinkedL
911
SinglyLinkedListNode lm1 = l1;
1012
SinglyLinkedListNode lm2 = l2;
1113

12-
while (lm1 != null || lm2 != null)
13-
{
14+
while (lm1 != null || lm2 != null) {
1415
int sum;
1516

1617
if (lm1 != null && lm2 != null) sum = lm1.getVal() + lm2.getVal() + carryover;
1718
else if (lm2 != null) sum = lm2.getVal() + carryover;
1819
else sum = lm1.getVal() + carryover;
1920

20-
if (sum > 9)
21-
{
21+
if (sum > 9) {
2222
carryover = 1;
2323
sum %= 10;
24-
}
25-
else
26-
{
24+
} else {
2725
carryover = 0;
2826
}
2927

@@ -38,11 +36,60 @@ public SinglyLinkedListNode addTwoNumbers(SinglyLinkedListNode l1, SinglyLinkedL
3836
lm2 = (lm2 != null) ? lm2.getNext() : null;
3937
}
4038

41-
if (carryover == 1)
42-
{
39+
if (carryover == 1) {
4340
sumNode.setNext(new SinglyLinkedListNode(carryover));
4441
}
4542

4643
return head;
4744
}
45+
46+
public SinglyLinkedListNode reverseList(SinglyLinkedListNode head) {
47+
SinglyLinkedListNode dummy = null;
48+
SinglyLinkedListNode next;
49+
while (head != null) {
50+
next = head.getNext();
51+
head.setNext(dummy);
52+
dummy = head;
53+
head = next;
54+
}
55+
56+
return dummy;
57+
}
58+
59+
// Slow and Fast Pointers - LinkedList
60+
public SinglyLinkedListNode middleNode(SinglyLinkedListNode head) {
61+
SinglyLinkedListNode slow = head, fast = head;
62+
63+
while (fast != null && fast.getNext() != null) {
64+
slow = slow.getNext();
65+
fast = fast.getNext().getNext();
66+
}
67+
68+
return slow;
69+
}
70+
71+
public SinglyLinkedListNode mergeTwoLists(SinglyLinkedListNode list1, SinglyLinkedListNode list2) {
72+
if (list1 == null) return list2;
73+
else if (list2 == null) return list1;
74+
75+
SinglyLinkedListNode l1 = list1, l2 = list2;
76+
SinglyLinkedListNode result = list1.getVal() <= l2.getVal() ? list1 : l2;
77+
SinglyLinkedListNode tmp = l1.getVal() > l2.getVal() ? l2 : l1;
78+
while (l1 != null) {
79+
if (l1.getVal() > l2.getVal()) {
80+
tmp = l1;
81+
l1 = l2;
82+
l2 = tmp;
83+
}
84+
while (l1.getVal() <= l2.getVal()) {
85+
tmp = l1;
86+
l1 = l1.getNext();
87+
88+
if (l1 == null) break;
89+
}
90+
tmp.setNext(l2);
91+
}
92+
93+
return result;
94+
}
4895
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.dojo.leetcode;
2+
3+
import java.util.Objects;
4+
5+
public class SinglyLinkedList {
6+
7+
private SinglyLinkedListNode head;
8+
public SinglyLinkedListNode getHead() { return head; }
9+
public void setHead(SinglyLinkedListNode head) { this.head = head; }
10+
public SinglyLinkedList() { this.head = null; }
11+
12+
public void add(int data) {
13+
var newNode = new SinglyLinkedListNode(data);
14+
15+
if (head == null) {
16+
setHead(newNode);
17+
} else {
18+
SinglyLinkedListNode current = getHead();
19+
while (current.getNext() != null) current.setNext(current.getNext());
20+
current.setNext(newNode);
21+
}
22+
}
23+
public static class SinglyLinkedListNode {
24+
private int val;
25+
public int getVal() { return val; }
26+
public void setVal(int val) { this.val = val; }
27+
28+
private SinglyLinkedListNode next;
29+
public SinglyLinkedListNode getNext() { return next; }
30+
public void setNext(SinglyLinkedListNode next) { this.next = next; }
31+
32+
@Override
33+
public boolean equals(Object o) {
34+
if (!(o instanceof SinglyLinkedListNode second)) return false;
35+
return getVal() == second.getVal();
36+
}
37+
@Override
38+
public int hashCode() { return Objects.hashCode(getVal()); }
39+
40+
public SinglyLinkedListNode() { this(0, null); }
41+
public SinglyLinkedListNode(int val) { this(val, null); }
42+
public SinglyLinkedListNode(int val, SinglyLinkedListNode next) {
43+
this.val = val;
44+
this.next = next;
45+
}
46+
}
47+
}

src/main/java/org/dojo/leetcode/SinglyLinkedListNode.java

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/test/java/org/dojo/leetcode/LinkedListProblemsTests.java

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.dojo.leetcode;
22

3+
import org.dojo.leetcode.SinglyLinkedList.SinglyLinkedListNode;
34
import org.junit.jupiter.params.ParameterizedTest;
45
import org.junit.jupiter.params.provider.Arguments;
56
import org.junit.jupiter.params.provider.MethodSource;
@@ -9,10 +10,9 @@
910
import static org.junit.jupiter.api.Assertions.assertEquals;
1011

1112
class LinkedListProblemsTests {
12-
1313
private final LinkedListProblems sut = new LinkedListProblems();
1414

15-
static Stream<Arguments> inlineData() {
15+
static Stream<Arguments> addTwoNumbersData() {
1616
return Stream.of(
1717
Arguments.of(
1818
new SinglyLinkedListNode(2, new SinglyLinkedListNode(4, new SinglyLinkedListNode(3))),
@@ -29,14 +29,49 @@ static Stream<Arguments> inlineData() {
2929
}
3030

3131
@ParameterizedTest
32-
@MethodSource("inlineData")
32+
@MethodSource("addTwoNumbersData")
3333
void addTwoNumbers(SinglyLinkedListNode l1, SinglyLinkedListNode l2, SinglyLinkedListNode expected) {
3434
SinglyLinkedListNode actual = sut.addTwoNumbers(l1, l2);
3535

36-
while(expected.getNext() != null) {
36+
while (expected.getNext() != null) {
3737
assertEquals(expected, actual);
3838
expected = expected.getNext();
3939
actual = actual.getNext();
4040
}
4141
}
42+
43+
static Stream<Arguments> mergeTwoListsData() {
44+
return Stream.of(
45+
Arguments.of(
46+
linkedListFromArray(new int[] {1, 2, 4}),
47+
linkedListFromArray(new int[] {1, 3, 4}),
48+
linkedListFromArray(new int[] {1, 1, 2, 3, 4, 4})
49+
)
50+
);
51+
}
52+
private static SinglyLinkedListNode linkedListFromArray(int[] arr) {
53+
if (arr == null || arr.length == 0) return null;
54+
55+
SinglyLinkedListNode head = new SinglyLinkedListNode(arr[0]);
56+
SinglyLinkedListNode current = head;
57+
58+
for (int i = 1; i < arr.length; i++) {
59+
SinglyLinkedListNode newNode = new SinglyLinkedListNode(arr[i]);
60+
current.setNext(newNode);
61+
current = newNode;
62+
}
63+
64+
return head;
65+
}
66+
@ParameterizedTest
67+
@MethodSource("mergeTwoListsData")
68+
void mergeTwoLists(SinglyLinkedListNode list1, SinglyLinkedListNode list2, SinglyLinkedListNode expectedList) {
69+
SinglyLinkedListNode actual = sut.mergeTwoLists(list1, list2);
70+
SinglyLinkedListNode expected = expectedList;
71+
while (expected != null) {
72+
assertEquals(expected.getVal(), actual.getVal());
73+
expected = expected.getNext();
74+
actual = actual.getNext();
75+
}
76+
}
4277
}

0 commit comments

Comments
 (0)