Problem
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 contain a single digit. Add the two numbers and return it as a linked list. (두개의 양수가 각각의 자리들이 역순의 리스트로 저장되어 있고, 이 둘의 합을 동일한 형태의 리스트로 반환)
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.
풀이
1. 기본적으로 링크드 리스트의 자료 구조를 이해하고 있어야 하며, Doubly linked list가 아니기 때문에 가장 처음 리스트의 주소값을 가지는 노드가 필요하다.
2. 각 자리의 수를 더할 때에 4+3은 하나의 자리로 표현 가능하지만 4+7이 되면 현재의 자리를 1이 되고 10에 해당하는 값이 다음 자리로 넘어가야 하기 때문에 이를 처리하기 위한 변수가 존재해야 한다.
3. Pseudo-codes는 대략 아래와 같다.
- 현재 노드를 결과값을 반환할 리스트의 처음 노드로 초기화 한다.
- 자리수가 넘어가는 값을 표현하는 carry를 0으로 초기화 한다.
- 입력 리스트인 l1과 l2의 처음 노드를 node1, node2에 할당한다.
- l1과 l2 리스트가 마지막 노드가 될 때까지 아래를 반복한다.
- Set x에 node1의 값을, y에 node2의 값을 할당하고 None이면 0을 반환한다.
- sum = x + y + carry
- carry = sum / 10
- (sum mod 10) 의 값으로 새로운 노드를 만들어 준 후 현재 노드의 다음 노드로 연결해 준다. 그리고 현재 노드를 다음 노드로 이동한다.
- node1과 node2를 다음 노드로 각각 이동한다.
- 만약 carry가 1을 가지고 있으면 최종 결과 리스트에 1을 가지는 새로운 노드를 추가해 준다.
- 결과값을 가지는 리스트의 다음 노드값을 반환해 준다.
4. 파이썬 코드
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def get_next(self, node):
try:
return node.next
except:
return None
def get_value(self, node):
if node == None:
return 0
else:
return node.val
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
result = ListNode(0)
cur_node = result
node1 = l1
node2 = l2
carry = 0
while True:
x = self.get_value(node1)
y = self.get_value(node2)
digit_sum = x + y + carry
carry = int (digit_sum / 10)
cur_node.next = ListNode(digit_sum % 10)
node1 = self.get_next(node1)
node2 = self.get_next(node2)
if node1 == None and node2 == None:
break
cur_node = cur_node.next
if carry > 0:
cur_node.next = ListNode(carry)
return result.next
동일한 논리를 가져가기 위해서 노드 값 및 노드 이동을 함수로 만들어서 예외처리를 하였다.
'코드 이야기' 카테고리의 다른 글
[LeetCode] Letter Combinations of a Phone Number - medium level (0) | 2019.07.22 |
---|---|
[LeetCode] String to Integer (atoi) - medium level (0) | 2019.07.18 |
facebook 메신저 봇 사용하기 (0) | 2016.06.18 |
Thrift Server를 이용하여 PHP로 자바 어플리케이션 사용하기 (0) | 2012.02.17 |
java application에 jetty server embedding하기 (0) | 2012.02.17 |