Programming Languages war Python, PHP, Javascrip (Nodejs) Add Two Numbers

Hey my friends, a new post about this war. I don't know which is better, but I'll try to figure it out. I hope y'all enjoy this series. Here we go!

This is a challenge of leetcode.com I made this challenge with python3, and next I made PHP and Javacript the same way.

Problem:

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.

Example 1:

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

Python

I receive two objects and I have to add, I used "while" to iterate the object and pass to list, it's easier manipulate the number of this way, I reverse the list with the method "reverse()", and turn list to string and then to integer, I add both numbers and reverse again and return the list converted to ListNode Object.

# Definition for singly-linked list.
class ListNode:
  def __init__(self, x):
    self.val = x
    self.next = None

class Solution:
  def addTwoNumbers(self, l1, l2):
    al = list()
    bl = list()

    while l1 or l2:   
      (al.append(l1.val) if l1 else None)
      (bl.append(l2.val) if l2 else None)      
      l1 = (l1.next if l1 else None)
      l2 =(l2.next if l2 else None)

    al.reverse()
    bl.reverse()
    str1 = ''.join(map(str, al))
    str2 = ''.join(map(str, bl))
    result = int(str1) + int(str2)
    result = list(str(result))
    result.reverse()
    return self.createList(ListNode(0), result, 0)

  def createList(self, node, list, pos):
    if node.val == 0:
      if len(list) > pos:
        node.val = list[pos]
        self.createList(node, list, pos+1)
    else:
      if len(list) > pos:
        node.next = ListNode(list[pos])
        if(len(list) > pos+1):
          self.createList(node.next, list, pos+1)
        else:
          return node
    return node


sol = Solution()
a = sol.createList(ListNode(0), [2,4,3], 0)
b = sol.createList(ListNode(0), [5,6,4], 0)
solve = sol.addTwoNumbers(a, b)

print(solve)

PHP

I receive two objects and I have to add, I used "while" to iterate the object and to turn to array, it's easier to manipulate the number of this way. I try to use reverse here, that exist a method for that, but when I try to send my solution is not successful in all cases. For example an array with length 31, because when I turn this array in a number return a number like 1E+30, then I can't solve that, but I resolve the challenge the other way. I validate what an array is longer, so, I add but to left to right and validate if the result is gran than 9 and save the number in a new array and return the array converted to ListNode Object.

<?php
class ListNode
{
    public $val  = 0;
    public $next = null;
    public function __construct($val = 0, $next = null)
    {
        $this->val  = $val;
        $this->next = $next;
    }
}

class Solution
{
    public function addTwoNumbers($l1, $l2)
    {
        $al = array();
        $bl = array();

        while ($l1) {
            $al[] = $l1->val;
            $l1   = $l1->next ? $l1->next : null;
        }

        while ($l2) {
            $bl[] = $l2->val;
            $l2   = $l2->next ? $l2->next : null;
        }
        if (count($al) > count($bl) || count($al) == count($bl)) {
            $pending = 0;
            for ($i = 0; $i < count($al); $i++) {
                $a = $al[$i];
                $b = !empty($bl[$i]) ? $bl[$i] : 0;
                $r = $a + $b + $pending;
                if ($r > 9) {
                    $result[] = (strval($r))[1];
                    $pending  = (strval($r))[0];
                } else {
                    $result[] = strval($r);
                    $pending  = 0;
                }

            }
            if($pending){
                $result[] = $pending;
            }
        } else {
            $pending = 0;
            for ($i = 0; $i < count($bl); $i++) {
                $a = $bl[$i];
                $b = !empty($al[$i]) ? $al[$i] : 0;
                $r = $a + $b + $pending;
                if ($r > 9) {
                    $result[] = (strval($r))[1];
                    $pending  = (strval($r))[0];
                } else {
                    $result[] = strval($r);
                    $pending  = 0;
                }

            }
            if($pending){
                $result[] = $pending;
            }
        }

        return $this->createList(new ListNode(0), $result, 0);

    }
    public function createList($node, $arr, $pos)
    {
        if ($node->val == 0 && $pos == 0) {

            if (count($arr) > $pos) {
                $node->val = $arr[$pos];
                $this->createList($node, $arr, $pos + 1);
            }
        } else {

            if (count($arr) > $pos) {
                $node->next = new ListNode($arr[$pos]);
                if (count($arr) > $pos + 1) {
                    $this->createList($node->next, $arr, $pos + 1);
                } else {
                    return $node;
                }

            }
        }
        return $node;
    }
}

$sol = new Solution();
$a   = $sol->createList(new ListNode(0), [2,4,9], 0);
$b   = $sol->createList(new ListNode(0), [5,6,4,9], 0);

$solve = $sol->addTwoNumbers($a, $b);

var_dump($solve);


?>

Javascript

I receive two objects and I have to add, I used "while" to iterate the object and to turn to array, it's easier to manipulate the number of this way, I try to use reverse here, that exist a method for that, but when to try to send my solution is not successful in all cases. For example an array with length 31, because when I turn this array in a number return a number like 1E+30 the same that PHP, then I can't solve that, but I resolve the challenge the other way. I validate what an array is longer, so, I add but to left to right and validate if the result is gran than 9 and save the number in a new array and return the array converted to ListNode Object.

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

class Solution {
  addTwoNumbers(l1, l2) {
    let al = [];
    let bl = [];

    while (l1) {
      al.push(l1.val);
      l1 = l1.next ? l1.next : null;
    }

    while (l2) {
      bl.push(l2.val);
      l2 = l2.next ? l2.next : null;
    }
    let pending = 0;
    let result = [];
    if (al.length > bl.length || al.length == bl.length) {
      for (let i = 0; i < al.length; i++) {
        let a = al[i];
        let b = bl[i] ? bl[i] : 0;
        let r = a + b + parseInt(pending);
        if (r > 9) {
          result.push(String(r)[1]);
          pending = String(r)[0];
        } else {
          result.push(String(r));
          pending = 0;
        }
      }
      if (pending) {
        result.push(pending);
      }
    }
    if (al.length < bl.length) {
      for (let i = 0; i < bl.length; i++) {
        let a = bl[i];
        let b = al[i] ? al[i] : 0;
        let r = a + b + parseInt(pending);
        if (r > 9) {
          result.push(String(r)[1]);
          pending = String(r)[0];
        } else {
          result.push(String(r));
          pending = 0;
        }
      }
      if (pending) {
        result.push(pending);
      }
    }


    return this.createList(new ListNode(0), result, 0);
  }
  createList(node, arr, pos) {
    if (node.val == 0 && pos == 0) {
      if (arr.length > pos) {
        node.val = arr[pos];
        this.createList(node, arr, pos + 1);
      }
    } else {
      if (arr.length > pos) {
        node.next = new ListNode(arr[pos]);
        if (arr.length > pos + 1) {
          this.createList(node.next, arr, pos + 1);
        } else {
          return node;
        }
      }
    }
    return node;
  }
}

const sol = new Solution();
const a = sol.createList(new ListNode(0), [2, 4, 3], 0);
const b = sol.createList(new ListNode(0), [5, 6, 4], 0);
const solve = sol.addTwoNumbers(a, b);

console.log(solve);

Conclusion

Structure: Python: I don't have problem to manipulate long integer, PHP and Javascript I have to change my first solution, I don't change my python way to be like PHP and Javascript because was a little slower in Python. Lines: Python: 47, PHP: 107, Javascript: 87 Time to execution: Python: 72 ms, PHP: 28 ms, Javascript: 144 ms Memory Usage: Python: 14.5 MB, PHP: 15.8 MB, Javascript: 46.6 MB

Would you like that I write about more challenges?

I hope you enjoy my post and remember that I am just a Dev like you!

No Comments Yet