Skip to content

Commit 21723a6

Browse files
committed
Added task 23.
1 parent 544b09d commit 21723a6

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package s0023.merge.k.sorted.lists;
2+
3+
public class ListNode {
4+
int val;
5+
ListNode next;
6+
7+
ListNode() {}
8+
9+
ListNode(int val) {
10+
this.val = val;
11+
}
12+
13+
ListNode(int val, ListNode next) {
14+
this.val = val;
15+
this.next = next;
16+
}
17+
18+
public String toString() {
19+
String result = "" + val;
20+
if (next.next != null) {
21+
result += ", ";
22+
}
23+
ListNode current = next;
24+
while (current.next != null) {
25+
result += current.val;
26+
if (current.next != null) {
27+
result += ", ";
28+
}
29+
current = current.next;
30+
}
31+
result += current.val;
32+
return result;
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package s0023.merge.k.sorted.lists;
2+
3+
public class Solution {
4+
public ListNode mergeKLists(ListNode[] lists) {
5+
if (lists.length == 0) return null;
6+
return mergeKLists(lists, 0, lists.length);
7+
}
8+
9+
private ListNode mergeKLists(ListNode[] lists, int leftIndex, int rightIndex) {
10+
if (rightIndex > leftIndex + 1) {
11+
int mid = (leftIndex + rightIndex) / 2;
12+
ListNode left = mergeKLists(lists, leftIndex, mid);
13+
ListNode right = mergeKLists(lists, mid, rightIndex);
14+
return mergeTwoLists(left, right);
15+
} else {
16+
return lists[leftIndex];
17+
}
18+
}
19+
20+
private ListNode mergeTwoLists(ListNode left, ListNode right) {
21+
if (left == null) return right;
22+
if (right == null) return left;
23+
ListNode res = null;
24+
if (left.val <= right.val) {
25+
res = left;
26+
left = left.next;
27+
} else {
28+
res = right;
29+
right = right.next;
30+
}
31+
ListNode node = res;
32+
while (left != null || right != null) {
33+
if (left == null) {
34+
node.next = right;
35+
right = right.next;
36+
} else if (right == null) {
37+
node.next = left;
38+
left = left.next;
39+
} else {
40+
if (left.val <= right.val) {
41+
node.next = left;
42+
left = left.next;
43+
} else {
44+
node.next = right;
45+
right = right.next;
46+
}
47+
}
48+
node = node.next;
49+
}
50+
return res;
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package s0023.merge.k.sorted.lists;
2+
3+
import static org.hamcrest.CoreMatchers.equalTo;
4+
import static org.hamcrest.MatcherAssert.assertThat;
5+
6+
import java.util.Arrays;
7+
import org.junit.Test;
8+
9+
public class SolutionTest {
10+
@Test
11+
public void mergeKLists() {
12+
ListNode head = new ListNode();
13+
ListNode node1 = new ListNode();
14+
node1.val = 1;
15+
head.next = node1;
16+
ListNode node2 = new ListNode();
17+
node2.val = 4;
18+
node1.next = node2;
19+
ListNode node3 = new ListNode();
20+
node3.val = 5;
21+
node2.next = node3;
22+
ListNode head2 = new ListNode();
23+
ListNode node4 = new ListNode();
24+
node4.val = 1;
25+
head2.next = node4;
26+
ListNode node5 = new ListNode();
27+
node5.val = 3;
28+
node4.next = node5;
29+
ListNode node6 = new ListNode();
30+
node6.val = 4;
31+
node5.next = node6;
32+
ListNode head3 = new ListNode();
33+
ListNode node7 = new ListNode();
34+
node7.val = 2;
35+
head3.next = node7;
36+
ListNode node8 = new ListNode();
37+
node8.val = 6;
38+
node7.next = node8;
39+
assertThat(
40+
new Solution().mergeKLists(new ListNode[] {node1, node4, node7}).toString(),
41+
equalTo("1, 1, 2, 3, 4, 4, 5, 6"));
42+
}
43+
}

0 commit comments

Comments
 (0)