森田賢二のleetCodeの使い方、解説、解答を毎日更新しているキャラクター

[leetcode]問題解決と解説。2. Add Two Numbers [JavaScript]

[leetcode]問題解決。2. Add Two Numbers [JavaScript]

皆さんleetCode好きですよね。私も好きです。
なかなかやる機会がないのですよね。
leetCodeの使い方や解説ではなく実際に問題を解決するために何をしたか
をメモ書きして行きます

私はある決意をして今臨んでいます。
モチベーションを保つためだけにこれをやっています。

では今日のleetCode。
「2. Add Two Numbers」の解決策と方法。自分がまず挑戦して
やったことをさらけ出します。

※下にある自分のコードは自分で設けた制限時間内に書けたところまです。

これは
「私は年末までこれを続けたらどんなleetCoderになるか」のシリーズ。
実験的ブログ更新です。

森田賢二のleetCode
森田賢二の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 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.

2つの負でない整数を表す2つの空でないリンクリストが与えられている.数字は逆順に格納されており,それぞれのノードには1桁の数字が格納されている.2つの数値を加算し,その和をリンクリストとして返せ.

このとき、2つの数値には0以外の先行する0が含まれていないと仮定してよい。

exampleは実際の問題ページを見てください

Example 1:

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]

2. Add Two Numbers 問題ページ

2. Add Two Numbers

2. Add Two Numbers

my code is not good

function addTwoNumbers(l, l2){
    let n = [l]
    let n2 = [l2]
    let i = 0
    let nr = []
    let n2r = []
    while(n.length !== 0 && n2.length !== 0){
        n.push(n[i].next)
        n2.push(n2[i].next)
        n.shift()
        n2.shift()
        i++
    }
    const rr = nr.reverse()
    const r2 = n2r.reverse()
}

class ListNode {
    val
    next
    constructor(val, next) {
    this.val = (val===undefined ? 0 : val)
    this.next = (next===undefined ? null : next)
    }
}

let rlst2 = new ListNode(4)
let rls1 = new ListNode(6, rlst2)
let rl = new ListNode(5, rls1)

let lsit3 = new ListNode(3)
let lsit1 = new ListNode(4, lsit3)
let list = new ListNode(2, lsit1)

let result = addTwoNumbers(list, rl)

時間切れ。

  • 問題を間違って解釈していた
    その上でさらに
    これじゃないよな感が強くて新たな発想を必要で手が止まった

2. Add Two Numbers。discussの中の一つの解答例

数ある中からJavaScriptのもので、理解しやすい解説をピックアップしました。
discussから見ればさらにもっと違う方法で真似したくなるものがあるかもしれないですね

JavaScriptでfilterされている、discussはこちらから

これが違う実装

2. Add Two Numbers

1

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    var List = new ListNode(0); // 入れ替える用のListを作る
    var head = List;
    var sum = 0;
    var carry = 0;

    while(l1!==null||l2!==null||sum>0){

        if(l1!==null){
            sum = sum + l1.val;
            l1 = l1.next;
        }
        if(l2!==null){
            sum = sum + l2.val;
            l2 = l2.next;
        }
        if(sum>=10){
            carry = 1; // 桁が上がったら1にする
            sum = sum - 10;
        }

        head.next = new ListNode(sum);
        head = head.next;

        sum = carry;
        carry = 0;

    }
    return List.next;
};

違う実装

var addTwoNumbers = function(l1, l2) {
  const head = new ListNode();
  let cursor = head;
  let carry = 0;
  while (l1 || l2 || carry) {
    cursor.next = new ListNode();
    cursor = cursor.next;
    let val = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + carry;
    carry = val >= 10 ? 1 : 0;
    cursor.val = val % 10;
    l1 = l1 ? l1.next : null;
    l2 = l2 ? l2.next : null;
  }
  return head.next;
};

2. Add Two Numbersをやってみて感想

  • WIP

カテゴリー leetCode