ListNode
: 연결 리스트의 노드 개수 ()
Node.val
: 노드 안의 정수 ()
2개의 연결 리스트 내에 음이 아닌 정수가 노드마다 1개씩 들어가 있는 상태이다.
연결 리스트 내의 노드를 역순으로 해서 정수로 만들고 그렇게 만들어진 2개의 정수를 더한 후 역순으로 새로운 연결 리스트 노드에 넣어주어 반환하는 문제이다.
이 문제는 리스트에 넣어 역순 정렬, 형변환, 덧셈을 진행해서 해결했다.
연결리스트 노드의 정수를 리스트에 넣기 →
순서 뒤집기 →
문자열 변환 →
리스트 요소 합치기 →
형변환 후 리스트 넣기 →
연결 리스트 만들어 넣기 →
최종 시간복잡도
최악일 때 이 되는데 이는 충분히 수행 가능하다.
l1
을 순환하면서 리스트에 하나씩 넣는 코드에서 다음 노드로 넘어가는 부분을 구현해주지 않아서 발생했다.''.join()
함수는 내부의 요소들이 문자열일때만 동작 가능하다.# 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: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
# 리스트 정의
li_l1 = []
li_l2 = []
# 리스트에 넣기
while True:
li_l1.append(l1.val)
if l1.next == None:
break
l1 = l1.next
while True:
li_l2.append(l2.val)
if l2.next == None:
break
l2 = l2.next
# 순서 뒤집기
li_l1 = li_l1[::-1]
li_l2 = li_l2[::-1]
# 요소들 문자열로 변환
for i in range(len(li_l1)):
li_l1[i] = str(li_l1[i])
for i in range(len(li_l2)):
li_l2[i] = str(li_l2[i])
# 리스트 요소 합치기
li_l1 = ''.join(li_l1)
li_l2 = ''.join(li_l2)
# 덧셈 연산 후 형변환하고 리스트에 넣기
li_answer = list(str(int(li_l1) + int(li_l2)))
# 역순으로 바꾸기
li_answer = li_answer[::-1]
# 요소들 정수형으로 변환
li_answer = [int(x) for x in li_answer]
# 연결리스트에 넣기
head = ListNode(li_answer[0])
current = head
for i in range(1, len(li_answer)):
current.next = ListNode(li_answer[i])
current = current.next
return head
class Solution:
def addTwoNumbers(
self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
dummyHead = ListNode(0)
curr = dummyHead
carry = 0
while l1 != None or l2 != None or carry != 0:
l1Val = l1.val if l1 else 0
l2Val = l2.val if l2 else 0
columnSum = l1Val + l2Val + carry
carry = columnSum // 10
newNode = ListNode(columnSum % 10)
curr.next = newNode
curr = newNode
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
return dummyHead.next
carry
에 저장하면서 활용class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode()
curr = dummy
remainder = 0
while l1 or l2 or remainder:
total = remainder
if l1:
total += l1.val
l1 = l1.next
if l2:
total += l2.val
l2 = l2.next
remainder = total // 10
curr.next = ListNode(total % 10)
curr = curr.next
return dummy.next
remainder
변수에 저장해 다음 자릿수에 반영