leetcode——两数相加【二】

前言

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.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

题目

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]

Constraints:

The number of nodes in each linked list is in the range [1, 100].
0 <= Node.val <= 9
It is guaranteed that the list represents a number that does not have leading zeros.

解题

PHP

/**
 * Definition for a singly-linked list.
 * class ListNode {
 *     public $val = 0;
 *     public $next = null;
 *     function __construct($val = 0, $next = null) {
 *         $this->val = $val;
 *         $this->next = $next;
 *     }
 * }
 */
class Solution {

    /**
     * @param ListNode $l1
     * @param ListNode $l2
     * @return ListNode
     */
    function addTwoNumbers($l1, $l2) {
        $tail = new ListNode();
        $head = $tail;
        $carry  = 0;
         while ($l1 || $l2 || $carry ){
            $sum= $l1->val + $l2->val + $carry ;
            $carry = $sum> 9 ? 1 : 0;
            $tail->next = new ListNode($sum% 10);
            $tail = $tail->next;
            if($l1) $l1 = $l1->next;
            if($l2) $l2 = $l2->next;
         };
        return $head->next;
    }
            
}

JavaScript

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
        //创建进位
        let carry = 0
        //创建一个头链表用于保存结果
        let tail = new ListNode(0)
        //保存头链表的位置用于最后的链表返回
        let head = tail
        while ( carry || l1 || l2) {
            let n1 = l1 !== null ? l1.val : 0
            let n2 = l2 !== null ? l2.val : 0
            //求和
            let sum = n1 + n2 + carry
            //如果sum大于9进位则为1
            carry = sum > 9 ? 1 : 0
            //tail的下一个节点
            tail.next = new ListNode(sum % 10)
            //tail指向下一个节点
            tail = tail.next 
            //l1指向下一个节点,以便计算第二个节点值
            if (l1) l1 = l1.next 
            //l2指向下一个节点,以便计算第二个节点值
            if (l2) l2 = l2.next 
        }
        //head.next中保存的第一个节点是刚开始定义的0
        return head.next
};
学无止境,谦卑而行.
原文地址:https://www.cnblogs.com/wangyang0210/p/14546992.html