소프트웨어에 대한 모든 것

LeetCode 풀기 - 21. Merge Two Sorted Lists 본문

알고리즘/LeetCode

LeetCode 풀기 - 21. Merge Two Sorted Lists

앤테바 2021. 11. 20. 10:36
반응형

21. Merge Two Sorted Lists

https://leetcode.com/problems/merge-two-sorted-lists/

 

Merge Two Sorted Lists - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문제)

솔루션1) - iterative

l1 리스트를 기준으로 l2 리스트의 노드를 l1에 끼워놓는 방식입니다.

l2 노드가 l1에 insert가 될 때 이전 l1 노드의 주소를 알고 있어야 하므로 prev_l1 노드 정보를 계속 들고다녀야 합니다.

 

dummy 노드를 l1 노드 head에 연결하는 이유는 간결한 코드를 위해서 추가하였습니다.

dummy 노드의 최소값은 Node.val의 최소값이 -100 이브로 -100보다 작은 -200을 초기값으로 설정하였습니다.

 

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        if l1 is None:
            return l2
        if l2 is None:
            return l1
        if l1 is None and l2 is None:
            return None

        dummy = ListNode(-200)
        dummy.next = l1
        prev_l1 = dummy

        while l1 and l2:
            if l2.val < l1.val:
                temp = prev_l1.next
                prev_l1.next = l2

                next_l2 = l2.next
                l2.next = temp

                prev_l1 = l2
                l2 = next_l2

            else:
                prev_l1 = l1
                l1 = l1.next

        if l1 is None:
            prev_l1.next = l2

        return dummy.next

솔루션2) - iterative 간결

솔루션1)을 조금 더 간결하게 수정한 버전입니다.

tail 노드를 유지하면서 계속해서 tail에 노드를 추가해 가능 방식입니다.

코드가 훨씬 간결해지네요. 이해도 쉽습니다.

 

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        dummy = ListNode()
        tail = dummy
        
        while l1 and l2:
            if l1.val < l2.val:
                tail.next = l1
                l1 = l1.next
            else:
                tail.next = l2
                l2 = l2.next
            tail = tail.next
                
        if l1:
            tail.next = l1
        if l2:
            tail.next = l2
        
        return dummy.next

 

 

함께보면 좋은 영상:

https://www.youtube.com/watch?v=XIdigk956u0 

 

반응형
Comments