|
| 1 | +/** |
| 2 | + * Definition for singly-linked list. |
| 3 | + * function ListNode(val, next) { |
| 4 | + * this.val = (val===undefined ? 0 : val) |
| 5 | + * this.next = (next===undefined ? null : next) |
| 6 | + * } |
| 7 | + */ |
| 8 | +/** |
| 9 | + * @param {ListNode[]} lists |
| 10 | + * @return {ListNode} |
| 11 | + */ |
| 12 | +// ์ต์ ํ๋ K๊ฐ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ณํฉ - ์ฌ๊ท ๋ถํ ์ ๋ณต |
| 13 | +var mergeKLists = function (lists) { |
| 14 | + if (!lists || lists.length === 0) return null; |
| 15 | + if (lists.length === 1) return lists[0]; |
| 16 | + |
| 17 | + return mergeListsRange(lists, 0, lists.length - 1); |
| 18 | +}; |
| 19 | + |
| 20 | +// ๋ฒ์ ๋ด์ ๋ฆฌ์คํธ๋ค์ ์ฌ๊ท์ ์ผ๋ก ๋ณํฉ |
| 21 | +function mergeListsRange(lists, start, end) { |
| 22 | + // ๊ธฐ์ ์กฐ๊ฑด: ํ๋์ ๋ฆฌ์คํธ๋ง ๋จ์ ๊ฒฝ์ฐ |
| 23 | + if (start === end) { |
| 24 | + return lists[start]; |
| 25 | + } |
| 26 | + |
| 27 | + // ๋ ๊ฐ์ ๋ฆฌ์คํธ๋ง ๋จ์ ๊ฒฝ์ฐ |
| 28 | + if (start + 1 === end) { |
| 29 | + return mergeTwoLists(lists[start], lists[end]); |
| 30 | + } |
| 31 | + |
| 32 | + // ์ค๊ฐ์ ์ ๊ธฐ์ค์ผ๋ก ๋ถํ |
| 33 | + let mid = Math.floor((start + end) / 2); |
| 34 | + let left = mergeListsRange(lists, start, mid); |
| 35 | + let right = mergeListsRange(lists, mid + 1, end); |
| 36 | + |
| 37 | + return mergeTwoLists(left, right); |
| 38 | +} |
| 39 | + |
| 40 | +// ๋ ๊ฐ์ ์ ๋ ฌ๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๋ณํฉ (์ต์ ํ) |
| 41 | +function mergeTwoLists(l1, l2) { |
| 42 | + // null ์ฒดํฌ๋ฅผ ๋จผ์ ์ํํ์ฌ ๋ถํ์ํ ์ฐ์ฐ ๋ฐฉ์ง |
| 43 | + if (!l1) return l2; |
| 44 | + if (!l2) return l1; |
| 45 | + |
| 46 | + // ๋ ์์ ๊ฐ์ ๊ฐ์ง ๋
ธ๋๋ฅผ ์ ํํ๊ณ ์ฌ๊ท ํธ์ถ |
| 47 | + if (l1.val <= l2.val) { |
| 48 | + l1.next = mergeTwoLists(l1.next, l2); |
| 49 | + return l1; |
| 50 | + } else { |
| 51 | + l2.next = mergeTwoLists(l1, l2.next); |
| 52 | + return l2; |
| 53 | + } |
| 54 | +} |
0 commit comments