1
+ /**
2
+ * Definition for singly-linked list.
3
+ * class ListNode {
4
+ * val: number
5
+ * next: ListNode | null
6
+ * constructor(val?: number, next?: ListNode | null) {
7
+ * this.val = (val===undefined ? 0 : val)
8
+ * this.next = (next===undefined ? null : next)
9
+ * }
10
+ * }
11
+ */
12
+
13
+ function mergeTwoLists ( list1 : ListNode | null , list2 : ListNode | null ) : ListNode | null {
14
+
15
+ /**
16
+ * 방법1: [실패]
17
+ * - 접근법: for문 사용, list1, list2 중 긴 값을 기준으로 for문 최대 값 설정
18
+ * - 실패 이유: LinkedList를 배열처럼 접근하려 했으나, LinkedList는 .next로 순차 접근해야 함
19
+ * 또한 list1.next.length와 같은 속성이 존재하지 않음
20
+ */
21
+ // const getSortedList1 = () => {
22
+ // const maxLength = Math.max(list1.next.length, list2.next.length) + 1; // 오류: LinkedList에는 length 속성이 없음
23
+ // const results = [];
24
+ // const queue = [];
25
+
26
+ // for(let i = 0; i < maxLength; i++) {
27
+ // if(i === 0) {
28
+ // if(list1.val < list2.val) {
29
+ // results.push(list1.val);
30
+ // results.push(list2.val);
31
+ // } else {
32
+ // results.push(list2.val);
33
+ // results.push(list1.val);
34
+ // }
35
+ // } else {
36
+ // const currList1Val = list1.next[i - 1]; // 오류: LinkedList는 인덱스로 접근 불가
37
+ // const currList2Val = list2.next[i - 2]; // 오류: LinkedList는 인덱스로 접근 불가
38
+ // const resultsLatestVal = results[reulsts.length - 1]; // 오류: 변수명 오타 (reulsts)
39
+ // if(currList1Val < currList2Val) {
40
+ // if(currList1Val < resultsLatestVal) {
41
+
42
+ // }
43
+ // }
44
+ // }
45
+ // }
46
+ // };
47
+
48
+ /**
49
+ * 방법2: [실패]
50
+ * - 접근법: LinkedList를 배열로 변환 후 정렬
51
+ * - 실패 이유: LinkedList를 배열로 변환하는 과정에서 오류 발생
52
+ * list1.next와 list2.next는 배열이 아닌 ListNode 객체이므로 스프레드 연산자 사용 불가
53
+ * 또한 결과를 배열로 반환하지만 문제는 ListNode를 요구함
54
+ */
55
+ // const getSortedList2 = () => {
56
+ // const list1Next = list1.next ?? [];
57
+ // const list2Next = list2.next ?? [];
58
+ // console.log('debug1::', list1.val, list2.val, list1Next, list2Next)
59
+ // const result: number[] = [list1.val, list2.val, ...list1Next, ...list2Next]; // 오류: ListNode 객체는 스프레드 연산자로 펼칠 수 없음
60
+
61
+ // console.log('debug::', result)
62
+
63
+ // return list1; // 오류: 정렬된 결과가 아닌 원본 list1을 반환
64
+ // };
65
+
66
+ /**
67
+ * 방법3: [실패]
68
+ * - 접근법: for 문으로 next 없을 때까지 체크해서 배열에 추가한 다음 정렬 후 반환
69
+ * - 실패 이유: 배열에 값을 모으기만 하고 정렬 및 ListNode 생성 로직이 누락됨
70
+ * 또한 for 루프 조건이 잘못됨 (!!isEnd는 항상 false로 루프가 실행되지 않음)
71
+ * 마지막에 return 문이 불완전함
72
+ */
73
+ // const getSortedList3 = () => {
74
+ // const result = [list1.val, list2.val];
75
+ // let currList1 = list1.next;
76
+ // let currList2 = list2.next;
77
+
78
+ // let isEnd = false;
79
+ // for (let i = 0; !!isEnd; i++) { // 오류: !!isEnd는 항상 false (isEnd가 false로 초기화됨)
80
+ // if(currList1?.val) {
81
+ // result.push(currList1.val);
82
+ // }
83
+ // if(currList2?.val) {
84
+ // result.push(currList2.val);
85
+ // }
86
+
87
+ // if(currList1?.next) {
88
+ // currList1 = currList1.next;
89
+ // } else if (currList2?.next) {
90
+ // currList2 = currList2.next;
91
+ // } else {
92
+ // break;
93
+ // }
94
+ // }
95
+
96
+ // return // 오류: 반환값이 없음
97
+ // };
98
+
99
+ /**
100
+ * 방법4: [실패]
101
+ * - 접근법: ListNode 인스턴스로 결과 생성, head를 만들고 순차적으로 값 추가
102
+ * - 실패 이유: 구현이 완료되지 않음, 아이디어만 주석으로 남겨둠
103
+ */
104
+
105
+ /**
106
+ * 방법5:
107
+ * - 접근법: 새 ListNode 인스턴스를 생성하여 두 리스트의 값을 순차적으로 비교하며 병합
108
+ * - 시간 복잡도: O(n + m)
109
+ * - 공간 복잡도: O(n + m)
110
+ */
111
+ const getSortedList5 = ( ) => {
112
+ const dummy = new ListNode ( ) ;
113
+ let current = dummy ;
114
+
115
+ while ( list1 && list2 ) {
116
+ if ( list1 . val < list2 . val ) {
117
+ current . next = new ListNode ( list1 . val ) ;
118
+ list1 = list1 . next ;
119
+ } else {
120
+ current . next = new ListNode ( list2 . val ) ;
121
+ list2 = list2 . next ;
122
+ }
123
+ current = current . next ;
124
+ }
125
+
126
+ while ( ! ! list1 ) {
127
+ current . next = new ListNode ( list1 . val ) ;
128
+ list1 = list1 ?. next ;
129
+ current = current . next
130
+ }
131
+
132
+ while ( ! ! list2 ) {
133
+ current . next = new ListNode ( list2 . val ) ;
134
+ list2 = list2 ?. next ;
135
+ current = current . next
136
+ }
137
+
138
+ return dummy . next ;
139
+ } ;
140
+
141
+ /**
142
+ * 방법6: with GPT
143
+ * - 접근법: 방법5의 최적화 버전으로, 새 노드를 생성하지 않고 기존 노드를 재사용
144
+ * - 시간 복잡도: O(n + m)
145
+ * - 공간 복잡도: O(1)
146
+ */
147
+ const getSortedList6 = ( ) => {
148
+ const dummy = new ListNode ( ) ;
149
+ let current = dummy ;
150
+
151
+ while ( list1 && list2 ) {
152
+ if ( list1 . val < list2 . val ) {
153
+ current . next = list1 ;
154
+ list1 = list1 . next ;
155
+ } else {
156
+ current . next = list2 ;
157
+ list2 = list2 . next ;
158
+ }
159
+ current = current . next ;
160
+ }
161
+
162
+ current . next = list1 ?? list2 ;
163
+
164
+ return dummy . next ;
165
+ } ;
166
+
167
+ // return getSortedList1();
168
+ // return getSortedList2();
169
+ // return getSortedList3();
170
+ // return getSortedList5();
171
+ return getSortedList6 ( ) ;
172
+
173
+ } ;
0 commit comments