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을 사용하면 코드가 더 깔끔하고 안전해질 것 같다.