본문 바로가기
혼자 공부하는 것들/알고리즘

2. Add Two Numbers (leetcode python)

by applepick 2021. 10. 27.
반응형

문제:

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

두 개의 링크 리스트를 받아와 각 리스트를 역순으로 뒤집어 합을 구한 뒤 다시 링크 리스트로 반환해주는 문제입니다.

알고리즘을 풀면서 문제를 단위별로 쪼개는 연습을 하고 있습니다.

class Solution:
    #두개 숫자를 합해주는 함수
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        
    #링크리스트를 리스트로 변환해주는 함수
    def toList(self, node: ListNode) ->List:
    #링크리스트를 뒤집어주는 함수
    def reverseList(self, head: ListNode)-> ListNode:
    #리스트를 링크리스트로 변환해주는 함수
    def toReverseLinkedList(self, result: str) -> ListNode:

문제를 보자면 링크 리스트를 뒤집어주는 함수가 필요하고, 뒤집어진 링크 리스트를 리스트로 바꿔 연산을 한 뒤,  링크 리스트로 바꾸어 반환해주는 순서가 필요합니다. 이렇게 초반에 어떠한 기능이 필요한지 틀을 잡고 작성해가야 합니다.

class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        l1_list = self.toList(self.reverseList(l1))
        l2_list = self.toList(self.reverseList(l2))
        
        resultStr = int(''.join(str(s) for s in l1_list)) + int(''.join(str(s) for s in l2_list));
        
        return self.toReverseLinkedList(str(resultStr));
   
    #링크리스트를 리스트로 변환해주는 함수
    def toList(self, node: ListNode) ->List:
    	list: List =[]
        while node:
            list.append(node.val)
            node = node.next
        return list
    
    #링크리스트를 뒤집어주는 함수
    def reverseList(self, head: ListNode)-> ListNode:
        node, prev = head, None
        while node:
            next, node.next = node.next, prev
            prev, node = node, next
        return prev
        
    #리스트를 링크리스트로 변환해주는 함수
    def toReverseLinkedList(self, result: str) -> ListNode:
        prev: ListNode = None
        for i in result:
            node = ListNode(i)
            node.next = prev
            prev = node    
        return node

이렇게 기능별로 나누어 풀면 중복 사용하는 코드들을 줄여주고, 로직의 흐름을 잘 파악할 수 있는 장점이 있습니다.

반응형

댓글