LeetCode #2 Add Two Numbers プログラミング練習

問題:

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.

難易度: medium
入力: 二つのLinkedList
目的: 入力されたListはそれぞれ一つの整数を表している。ただし順序は逆である。二つのListが表す数字を足しそれを入力と同じ形式で出力せよ。
出力: LinkedList
注意: 入力は必ず一つの有効整数を表す。(1->2->0等は考慮しなくてよい)

LinkedListの問題です。
実は筆者、学生の時一番苦手なのがLinkedListでした。
自分でプログラムを組む時あまり使われない型ですが、要素の追加や削除がArrayListに比較して非常に速い為、面接の際によく聞かれる型の一つです。

例を見ればわかると思いますが、入力された数字(5->4->3であれば345を表しています)を足し、出力(123であれば3->2->1を出力する) するだけの問題です。

注意する点としては、繰り上げの処理くらいですね。
以下、自分の回答です。

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int s = 0;
        int v = 0;
        ListNode temp = new ListNode(0);
        ListNode result = temp;
        while(l1 != null && l2 != null) {
            v = l1.val + l2.val + s;
            if (v>=10) {
                s = 1;
                v -= 10;
            }
            else {
                s = 0;
            }
            temp.next = new ListNode(v);
            temp = temp.next;
            l1 = l1.next;
            l2 = l2.next;
            if (l1 == null && l2 != null) { 
                l1 = new ListNode(0);
            }
            else if (l1 != null && l2 == null) {
                l2 = new ListNode(0);
            }
            if (l1 == null && l2 == null && s == 1) {
                temp.next = new ListNode(s);
                break;
            }
        }
        return result.next;
    }
}

int sで繰り上げ数値を表します。入力順序が逆なのでそのまま順に計算すればAcceptをもらえます。
入力が Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) の場合:
v = 2+5 +s = 8
s = 0 (繰り上げが発生していない為)
temp.next = v
v = 4+6 +s = 10
s = 1
v = v-10=0
temp.next = 0
v = 3+4+s = 8(前の位で繰り上げあり)
s = 0
temp.next = v
while loop を抜けた後、最後に繰り上げが発生しているかどうかを判断し、あれば1を追加、なければそのまま出力で終了です。

ではでは