IT/Problem Solving
[LeetCode] Merge k Sorted Lists (Java)
erinh
2024. 3. 11. 23:13
반응형
Problem
Solution 1.
-T he number range of constraints is not large, so simply converting ListNode to List, sorting it, and returning it again. - - It exhibits poor time and space complexity results.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
List<Integer> mergeList = new ArrayList<>();
for (ListNode l : lists) {
ListNode curr = l;
while (curr != null) {
mergeList.add(curr.val);
curr = curr.next;
}
}
Collections.sort(mergeList);
ListNode ans = new ListNode();
ListNode tmp = ans;
for (int i : mergeList) {
tmp.next = new ListNode(i);
tmp = tmp.next;
}
return ans.next;
}
}
Solution 2.
- Using Merge Sort(divde-and-conquer)
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
// if there is only one ListNode, return immediately.
if (lists == null || lists.length == 0) return null;
return mergeLists(lists, 0, lists.length - 1);
}
private ListNode mergeLists(ListNode[] lists, int start, int end) {
if (start == end) return lists[start];
if (start + 1 == end) return merge(lists[start], lists[end]);
// using merge sort alogorithm
// divide lists until it is split into halves
int mid = start + (end - start) / 2;
ListNode left = mergeLists(lists, start, mid);
ListNode right = mergeLists(lists, mid + 1, end);
return merge (left, right);
}
private ListNode merge(ListNode l1, ListNode l2) {
ListNode tmp = new ListNode(0);
ListNode curr = tmp;
// compare and sort the nodes of the list
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
curr.next = l1;
l1 = l1.next;
} else {
curr.next = l2;
l2 = l2.next;
}
curr = curr.next;
}
// if any list becomes null,
curr.next = (l1 != null) ? l1 : l2;
return tmp.next;
}
}
반응형