문제링크: https://leetcode.com/problems/merge-k-sorted-lists/
주어진 오름차순 정렬된 연결 리스트들을 합해 하나의 오름차순 연결 리스트로 만드는 문제다.
병합 정렬과 비슷한 방법으로 병합해 새 연결 리스트를 만드는 것을 반복한다.
var mergeKLists = function(lists) {
// merge sort의 방식 (앞에서 부터 작은 수를 병합)
const mergeTwoLists = (a, b) => {
const dummy = new ListNode(0);
let cur = dummy;
while (a && b) {
if (a.val <= b.val) {
cur.next = a;
cur = a;
a = a.next;
} else {
cur.next = b;
cur = b;
b = b.next;
}
}
if (a) cur.next = a;
if (b) cur.next = b;
return dummy.next;
}
if (lists.length === 0) return null;
// result에 새 list 병합
let result = lists[0];
for (let list of lists.slice(1)) {
result = mergeTwoLists(result, list);
}
return result;
};
기존과 병합하는 과정은 똑같지만 병합하는 list
의 방법을 조절한다. Queue를 통해 이미 병합된 list의 우선순위를 뒤로 미뤄 긴 작업을 반복하는 것을 최적화 한다.
lists
를 큐의 형태로 사용한다.lists
의 가장 맨 뒤로 넣어 우선순위를 미룬다.var mergeKLists = function(lists) {
// 두 연결 리스트를 병합하는 함수
const mergeTwoLists = (a, b) => {
// ... 위와 같음
}
if (lists.length === 0) return null;
// lists as queue (병합된 리스트는 뒤로 추가해서 긴 리스트는 나중에 병합)
while (lists.length > 1) {
const a = lists.shift();
const b = lists.shift();
const mergedAB = mergeTwoLists(a, b);
lists.push(mergedAB);
}
return lists[0];
};