본문 바로가기

Computer Science/CODINGTEST_PRACTICE

[LeetCode] 21. Merge Two Sorted Lists 기록

반응형

 

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

 

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

 

두개의 linked list를 sorting하면서 합치는 문제

 

일단 적나라한 실력 테스트를 위해 그냥 풀었다.

 

# 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, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        new_head = None
        cnt_node = None
        while list1 is not None and list2 is not None:
            new_node = ListNode()
            if list1.val < list2.val: # when list1 is smaller than list2
                new_node.val = list1.val
                list1 = list1.next
            else: # when list2 is smaller than list2, or equal
                new_node.val = list2.val
                list2 = list2.next
            
            if new_head is None: # when head is None
                new_head = new_node
                cnt_node = new_node
            else: # when head is not None
                cnt_node.next = new_node
                cnt_node = new_node

        if list1 is None and list2 is not None: # when only list2 have node
            if new_head is None:
                new_head = list2
            else:
                cnt_node.next = list2
        elif list2 is None and list1 is not None: # when only list1 have node
            if new_head is None:
                new_head = list1
            else: 
                cnt_node.next = list1

        return new_head

 

한 번에 정답은 맞췄지만 코드 스타일이 학부생 때 딱 C언어로 자료구조 풀던 그 수준.(처참하다)

자료구조의 형태 자체는 제대로 이해하고 있다고 보이지만

내가 면접관이라고 해도

 

1. 파이썬에 적합한 형태인지(pythonic한지)는 의문

2. if else를 저렇게 많이 쓰면 코드 가독성이 너무 떨어진다.

 

 

이제는 시간을 가지고 내가 생각하는 최적의 코드를 만들어볼 시간

# 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, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        dummy = cur = ListNode()
        while list1 and list2:
            if list1.val < list2.val: # when list1 is smaller than list2
                cur.next = list1
                list1 = list1.next
            else: # when list2 is smaller than list2, or equal
                cur.next = list2
                list2 = list2.next
            cur = cur.next
            
        cur.next = list1 or list2

        return dummy.next

 

pythonic한 아주 편안한 코드가 완성

 

여기서 제일 특별한? 부분은 바로 object 끼리 or expression을 사용한 부분(19번라인)이라고 할 수 있다.

python에서는 None의 경우 false로 본다.

(빈 list, dict, set의 경우에는 None이나 False는 아니지만 False로 판단하므로 Falsy라고 한다.)

심지어 object가 아닌 함수에 대해서 or가 가능하다.

 

기본 동작 원칙은

or의 앞부분에 대해 먼저 수행하고 True면 뒤도 안보고 다음 라인으로 넘어가고

or의 앞부분이 false인 경우 뒷부분까지 수행한다.

이렇게 expression의 우선순위에 따라 순차적으로 수행되는 것을 short-circuit (lazy) evaluation라고 부른다.

 

이렇게 오늘도 조금 더 pyhtonic한 코드를 쓸 수 있게 된 기분.

 

[reference]

https://realpython.com/python-or-operator/#using-or-with-common-objects

 

반응형