
1669. Merge In Between Linked Lists
문제 설명
- LINKED LIST가 주어짐
- a~b사이를 잘라내고 그 부분을 LIST2로 대체해주면 끝 !
일단 끝까지 에러안뜨면서 탐색하기 위해선 다음과 같이 while문을 사용할 수 있겠다.
(결국 쓰지는 않게 되었다.)
var current = list1
while current?.next != nil {
current = current?.next
}
최종 코드
class Solution {
func mergeInBetween(_ list1: ListNode?, _ a: Int, _ b: Int, _ list2: ListNode?) -> ListNode? {
var ANSWER = list1 // 출력용 ANSWER
var END = ANSWER
var CURRENT = ANSWER
for i in 0 ..< a - 1 {
CURRENT = CURRENT?.next
}
for i in 0...b {
END = END?.next
}
CURRENT?.next = list2
while CURRENT?.next != nil {
CURRENT = CURRENT?.next
} // LIST2 끝까지 왔음
CURRENT?.next = END
return ANSWER!
}
}
결국 정답제출을 위해 거슬러 올라가는게 없기 때문에 ANSWER을 시작으로 파생을 시켜줬고, CURRENT는 a까지 간다음에
list2랑 연결해주고,END는 b까지 점프한다음에list2랑 연결 후, 맨뒤까지 이동한 친구랑 연결을 해주는 방식을 했다.
0...a까지가 겹치는것같은데, CURRENT에서 파생시키면 꼬일것 같아서 이렇게 수정을 했다.

타인의 코드
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func mergeInBetween(_ list1: ListNode?, _ a: Int, _ b: Int, _ list2: ListNode?) -> ListNode? {
var head = list1
for i in 1..<a {
if let h = head {
head = h.next
}
}
var tail = head
for i in a...b+1 {
if let t = tail {
tail = t.next
}
}
head?.next = list2
var lastElementinList2 = head
while (true) {
if let last = head {
lastElementinList2 = head
head = last.next
} else {
break
}
}
lastElementinList2?.next = tail
return list1
}
}
END를 바로 CURRENT에서 파생한 것으로 처리했기 때문에, 사실 구조는 동일하다.
이 문제를 풀면서 if let을 잘 활용해야겠다는 생각을 다시 한번 하게 되었다.
계속 current?.처럼 옵셔널을 언래핑하는 과정에서 고생을 했었는데, if let을 사용하면 코드가 더 깔끔하고 안전해질 것 같다.