2월 4주차 코딩연습일기

2 분 소요

Linked List를 배워보자.

문제

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.

예제

Input: l1 = [2,4,3], l2 = [5,6,4] Output: [7,0,8] Explanation: 342 + 465 = 807.

Example 2:

Input: l1 = [0], l2 = [0] Output: [0]

Example 3:

Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] Output: [8,9,9,9,0,0,0,1]

일단 Linked List를 처음 겪어봤다. 나중에 SLAM코드 짜면, Graph slam부분에서 응용되기 쉬울듯하다. 만약 Object SLAM에서 인식된 Object들 간의 관계를 정의하기도 좋을 것 같다.

해답지는 다음과 같다.

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
    numberL1 = 0  # numberL1 초기화
    digit = 0
    while l1:  # l1이 None이 아닐 때까지 반복
        numberL1 += l1.val * (10 ** digit)  # l1.val 사용
        l1 = l1.next  # 다음 노드로 이동
        digit += 1
    
    numberL2 = 0  # numberL2 초기화
    digit = 0
    while l2:  # l2가 None이 아닐 때까지 반복
        numberL2 += l2.val * (10 ** digit)  # l2.val 사용
        l2 = l2.next  # 다음 노드로 이동
        digit += 1

    L3 = numberL1 + numberL2

    # 결과를 ListNode 형태로 변환
    dummy_head = ListNode(0)  # 더미 헤드 노드
    current = dummy_head

    if L3 == 0:  # L3가 0일 경우
        return ListNode(0)

    while L3 > 0:  # L3가 0보다 큰 경우에만 반복
        current.next = ListNode(L3 % 10)  # 새로운 노드 생성
        current = current.next  # 현재 노드 이동
        L3 = L3 // 10  # 정수 나누기로 수정
    
    return dummy_head.next  # 더미 헤드의 다음 노드를 반환

기왕 하는김에, C++로 구현하면 아래처럼 된다.

#include <iostream>

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        long long numberL1 = 0;  // numberL1 초기화
        long long numberL2 = 0;  // numberL2 초기화
        int digit = 0;

        while (l1) {  // l1이 nullptr이 아닐 때까지 반복
            numberL1 += l1->val * pow(10, digit);  // l1->val 사용
            l1 = l1->next;  // 다음 노드로 이동
            digit++;
        }

        digit = 0;
        while (l2) {  // l2가 nullptr이 아닐 때까지 반복
            numberL2 += l2->val * pow(10, digit);  // l2->val 사용
            l2 = l2->next;  // 다음 노드로 이동
            digit++;
        }

        long long L3 = numberL1 + numberL2;

        // 결과를 ListNode 형태로 변환
        ListNode* dummyHead = new ListNode(0);  // 더미 헤드 노드
        ListNode* current = dummyHead;

        if (L3 == 0) {  // L3가 0일 경우
            return new ListNode(0);
        }

        while (L3 > 0) {  // L3가 0보다 큰 경우에만 반복
            current->next = new ListNode(L3 % 10);  // 새로운 노드 생성
            current = current->next;  // 현재 노드 이동
            L3 /= 10;  // 정수 나누기로 수정
        }

        return dummyHead->next;  // 더미 헤드의 다음 노드를 반환
    }
};

태그:

업데이트:

댓글남기기