diff --git a/missing-number/reeseo3o.js b/missing-number/reeseo3o.js new file mode 100644 index 0000000000..a1f8d6a3c3 --- /dev/null +++ b/missing-number/reeseo3o.js @@ -0,0 +1,9 @@ +// Time Complexity: O(n) +// Space Complexity: O(1) + +const missingNumber = (nums) => { + const n = nums.length; + const total = (n * (n + 1)) / 2; // 가우스 공식 + const sum = nums.reduce((acc, cur) => acc + cur, 0); + return total - sum; +}; diff --git a/reorder-list/reeseo3o.js b/reorder-list/reeseo3o.js new file mode 100644 index 0000000000..7ea721fba3 --- /dev/null +++ b/reorder-list/reeseo3o.js @@ -0,0 +1,42 @@ +// Time Complexity: O(n) +// Space Complexity: O(1) + +const reorderList = (head) => { + if (!head || !head.next || !head.next.next) return; + + // 1. 가운데 찾기 (slow는 앞쪽 리스트의 끝) + let slow = head; + let fast = head; + while (fast && fast.next) { + slow = slow.next; + fast = fast.next.next; + } + + // 2. 뒷부분 뒤집기 (slow.next ~ 끝) + let prev = null; + let curr = slow.next; + slow.next = null; // 앞부분과 뒷부분 분리 + + while (curr) { + const next = curr.next; + curr.next = prev; + prev = curr; + curr = next; + } + // prev: 뒤집힌 두 번째 리스트의 head + + // 3. 교차 머지 (head: 첫 번째, prev: 두 번째) + let first = head; + let second = prev; + + while (second) { + const nextFirst = first.next; + const nextSecond = second.next; + + first.next = second; + second.next = nextFirst; + + first = nextFirst; + second = nextSecond; + } +};