문제
2개의 비어있지 않은, 음수가 없는 listnode 를 받게 된다. 이것은 반대순서로 숫자가 저장되어 있으며 한 node 당 1개의 숫자가 들어 있다. 2개의 listnode 의 숫자를 제대로 배열해서 더한다음 다시 반대순서로 listnode 를 만들어서 return 하라.
예시
2 > 4 > 3, 5 > 6 > 4 의 listnode 가 주어진다면 두가지 listnode 에서 말하는 수는 342 와 465 이다. 이를 더하면 807이 되고 return 으로는 7 > 0 > 8 의 listnode 를 보내주면 된다.
풀이
의식의 흐름대로 문제를 푼다. 2 > 4 > 3의 listnode (l1) 를 일단 [2, 4, 3] 의 list (firstNum) 로 만들어준다. 그리고 뒤에서부터 순서대로 하나씩 꺼내서 다시 [3, 4, 2] 의 list (revFirstNum) 로 만들어준다. 그 다음에 처음부터 숫자를 하나씩 꺼내어 3 * ( 10 ^ (리스트길이 - 1)) 으로 하나씩 꺼내서 더해준다. 그러면 300 + 40 + 2 = 342로 int (numRevFirstNum) 으로 저장한다.
이런식으로 l2 도 진행하면 465로 저장이 되고 둘을 더하면 807(calcNum) 이 된다. 이를 다시 list로 만들고 다시 뒤에서부터 하나씩 꺼내어 listnode 로 만들어서 return 한다.
이때 return 할 listnode (l3) 을 만들때 시작 pointer 를 2개 (l3, head) 만들어서 하나는 뒤로 넘어가면서 값을 저장하고, 다른 하나는 return 할때 쓴다.
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
firstNum = []
secondNum = []
revFirstNum = []
revSecondNum = []
numRevFirstNum = 0
numRevSecondNum = 0
exit = 0
while(exit != 1):
firstNum.append(l1.val)
if l1.next == None:
exit = 1
else:
l1 = l1.next
exit = 0
while(exit != 1):
secondNum.append(l2.val)
if l2.next == None:
exit = 1
else:
l2 = l2.next
for i in range(len(firstNum) - 1, -1, -1):
revFirstNum.append(firstNum[i])
for i in range(len(secondNum) - 1, -1, -1):
revSecondNum.append(secondNum[i])
for i in range(len(revFirstNum)):
numRevFirstNum += revFirstNum[i] * (10 ** (len(revFirstNum) - (1 + i)))
for i in range(len(revSecondNum)):
numRevSecondNum += revSecondNum[i] * (10 ** (len(revSecondNum) - (1 + i)))
calcNum = numRevFirstNum + numRevSecondNum
strCalcNum = str(calcNum)
l3 = ListNode(strCalcNum[len(strCalcNum) -1])
head = l3
for i in range(len(strCalcNum) -2, -1, -1):
l3.next = ListNode(strCalcNum[i])
l3 = l3.next
return head
아직 사람들이올려놓은 것 만큼 간단한 코드는 아니지만, 나중에 좀더 최적화 해보기로 한다. 이문제를 통해 list 와 listnode 를 조금더 자유롭게 다룰수 있게 되었다.
댓글