[Swift] [64일차] 1669_LEET 순열 _ 링크드리스트

·2025년 2월 9일
0

SwiftAlgorithm

목록 보기
67/105
post-thumbnail

1669. Merge In Between Linked Lists


문제 설명

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

profile
기억보단 기록을

0개의 댓글