https://leetcode.com/problems/merge-two-sorted-lists/description/
두개의 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
'Computer Science > CODINGTEST_PRACTICE' 카테고리의 다른 글
[LeetCode] 217. Contains Duplicate (0) | 2022.12.18 |
---|---|
[LeetCode] 26. Remove Duplicates from Sorted Array 기록 (0) | 2022.11.21 |
[LeetCode] 151. Reverse Words in a String 기록 (0) | 2022.11.13 |
[LeetCode] 20. Valid Parentheses 기록 (2) | 2022.11.12 |
[LeetCode] 14. Longest Common Prefix (python3) (0) | 2022.07.12 |