|
| 1 | +# from typing import Optional, List |
| 2 | + |
| 3 | +# class ListNode: |
| 4 | +# def __init__(self, val=0, next=None): |
| 5 | +# self.val = val |
| 6 | +# self.next = next |
| 7 | + |
| 8 | +# # ํ์ด์ฌ์ toString ์ญํ ์ ํ๋ __repr__์ [1,3,4] ํํ๋ก ์ถ๋ ฅ๋๊ฒ ์์ |
| 9 | +# def __repr__(self): |
| 10 | +# nodes = [] |
| 11 | +# curr = self |
| 12 | +# while curr: |
| 13 | +# nodes.append(str(curr.val)) |
| 14 | +# curr = curr.next |
| 15 | +# return "[" + ",".join(nodes) + "]" |
| 16 | + |
| 17 | +# # ํ์ด์ฌ list๋ฅผ ListNode ๋ฆฌ์คํธ๋ก ๋ณํํด์ฃผ๋ ํฌํผ ํจ์ |
| 18 | +# def make_linked_list(arr: List[int]) -> Optional[ListNode]: |
| 19 | +# if not arr: |
| 20 | +# return None |
| 21 | +# dummy = ListNode(0) |
| 22 | +# curr = dummy |
| 23 | +# for val in arr: |
| 24 | +# curr.next = ListNode(val) |
| 25 | +# curr = curr.next |
| 26 | +# return dummy.next |
| 27 | + |
| 28 | + |
| 29 | +# list1์ ๋
ธ๋ ๊ฐ์๋ฅผ n, list2์ ๋
ธ๋ ๊ฐ์๋ฅผ m์ด๋ผ ํ ๋ |
| 30 | +# ์๊ฐ ๋ณต์ก๋: O(n + m) |
| 31 | +# ๊ณต๊ฐ ๋ณต์ก๋: O(n + m) -> |
| 32 | +class Solution_01: |
| 33 | + def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: |
| 34 | + # ๋งจ ์์ ๋๋ฏธ ๋
ธ๋๋ฅผ ํ๋ ์ถ๊ฐํ๋ค |
| 35 | + # ์๋ ์ํ๋ก ์งฐ๋๋ฐ if node: else: ๊ตฌ๋ฌธ ๋์ด๋์ ๋งจ ์์ ๊ฐ์์ ๋
ธ๋๋ฅผ ํ๋ ์ถ๊ฐํด์คฌ๋ค |
| 36 | + dummy = ListNode(None) |
| 37 | + node = dummy |
| 38 | + |
| 39 | + while True: |
| 40 | + # list1์ด ๋น์ด์์ผ๋ฉด ํ์ฌ ๋
ธ๋ ๋ค๋ก list2๋ฅผ ์ด์ด์ค๋ค. |
| 41 | + if not list1: |
| 42 | + node.next = list2 |
| 43 | + break |
| 44 | + |
| 45 | + # list2๊ฐ ๋น์ด์์ผ๋ฉด ํ์ฌ ๋
ธ๋ ๋ค๋ก list1์ ์ด์ด์ค๋ค. |
| 46 | + if not list2: |
| 47 | + node.next = list1 |
| 48 | + break |
| 49 | + |
| 50 | + # ๊ฐ์ ๋น๊ตํด์ ์์ ๊ฐ์ next ๋
ธ๋์ ์ถ๊ฐํ๋ค. |
| 51 | + if list1.val <= list2.val: |
| 52 | + node.next = ListNode(list1.val) |
| 53 | + # list1 ํ๋ ์๋น |
| 54 | + list1 = list1.next |
| 55 | + else: |
| 56 | + node.next = ListNode(list2.val) |
| 57 | + # list2 ํ๋ ์๋น |
| 58 | + list2 = list2.next |
| 59 | + |
| 60 | + # ๋ค์ ๋
ธ๋๋ฅผ ํ์ฌ ๋
ธ๋๋ก ํ ๋นํด์ค๋ค |
| 61 | + node = node.next |
| 62 | + |
| 63 | + return dummy.next |
| 64 | + |
| 65 | + |
| 66 | +# [์ ๊ทผ๋ฒ] Solution_01 ์ ๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ ํ์ต๋๋ค. |
| 67 | +# ListNode๋ฅผ ์๋ก ์์ฑํ์ง ์๊ณ ๊ธฐ์กด ๋
ธ๋๋ฅผ ํ์ฉํ๋๋ก ์์ ํ์ต๋๋ค. |
| 68 | + |
| 69 | +# list1์ ๋
ธ๋ ๊ฐ์๋ฅผ n, list2์ ๋
ธ๋ ๊ฐ์๋ฅผ m์ด๋ผ ํ ๋ |
| 70 | +# ์๊ฐ ๋ณต์ก๋: O(n + m) |
| 71 | +# ๊ณต๊ฐ ๋ณต์ก๋: O(1) -> dummy๋ง ์ฌ์ฉ, ์ถ๊ฐ ๊ณต๊ฐ ๋ณต์ก๋๋ O(1) |
| 72 | +class Solution_01: |
| 73 | + def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: |
| 74 | + # ๋งจ ์์ ๋๋ฏธ ๋
ธ๋๋ฅผ ํ๋ ์ถ๊ฐํ๋ค |
| 75 | + # ์๋ ์ํ๋ก ์งฐ๋๋ฐ if node: else: ๊ตฌ๋ฌธ ๋์ด๋์ ๋งจ ์์ ๊ฐ์์ ๋
ธ๋๋ฅผ ํ๋ ์ถ๊ฐํด์คฌ๋ค |
| 76 | + dummy = ListNode(None) |
| 77 | + node = dummy |
| 78 | + |
| 79 | + while True: |
| 80 | + if not list1: # list1์ด ๋น์ด์์ผ๋ฉด ํ์ฌ ๋
ธ๋ ๋ค๋ก list2๋ฅผ ์ด์ด์ค๋ค. |
| 81 | + node.next = list2 |
| 82 | + break |
| 83 | + |
| 84 | + if not list2: # list2๊ฐ ๋น์ด์์ผ๋ฉด ํ์ฌ ๋
ธ๋ ๋ค๋ก list1์ ์ด์ด์ค๋ค. |
| 85 | + node.next = list1 |
| 86 | + break |
| 87 | + |
| 88 | + # ๊ฐ์ ๋น๊ตํด์ ์์ ๊ฐ์ next ๋
ธ๋์ ์ถ๊ฐํ๋ค. |
| 89 | + if list1.val <= list2.val: |
| 90 | + node.next = list1 # ์๋ก์ด ListNode๋ฅผ ์์ฑํ์ง ์๊ณ list1๋ฅผ ํ ๋นํด์ค๋ค. |
| 91 | + list1 = list1.next # list1 ํ๋ ์๋น |
| 92 | + else: |
| 93 | + node.next = list2 # ์๋ก์ด ListNode๋ฅผ ์์ฑํ์ง ์๊ณ list2๋ฅผ ํ ๋นํด์ค๋ค. |
| 94 | + list2 = list2.next # list2 ํ๋ ์๋น |
| 95 | + |
| 96 | + # ๋ค์ ๋
ธ๋๋ฅผ ํ์ฌ ๋
ธ๋๋ก ํ ๋นํด์ค๋ค |
| 97 | + node = node.next |
| 98 | + |
| 99 | + return dummy.next |
| 100 | + |
| 101 | + |
| 102 | +# 4. ์์ ์
๋ ฅ์ผ๋ก ํธ์ถ ๋ฐ ํ
์คํธ |
| 103 | +# if __name__ == "__main__": |
| 104 | +# list1 = make_linked_list([1, 2, 4]) |
| 105 | +# list2 = make_linked_list([1, 3, 4]) |
| 106 | + |
| 107 | +# solution = Solution() |
| 108 | +# merged_list = solution.mergeTwoLists(list1, list2) |
| 109 | + |
| 110 | +# print(merged_list) |
0 commit comments