leetcode 445. 两数相加 II

445. 两数相加 II

https://leetcode-cn.com/problems/add-two-numbers-ii

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

示例:

输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7

翻转 头插法

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

    /**
     * @param ListNode $l1
     * @param ListNode $l2
     * @return ListNode
     */
    function addTwoNumbers($l1, $l2) {
        $l1 = $this->reverse($l1);
        $l2 = $this->reverse($l2);

        $carry = 0;
        $prev = new ListNode(0);
        while ($l1 || $l2 || $carry) {
            $val = 0;
            if ($l1 && $l2) {
                $val = $l1->val + $l2->val;
                $l1 = $l1->next;
                $l2 = $l2->next;
            } elseif ( $l1 && !$l2) {
                $val = $l1->val;
                $l1 = $l1->next;
            } elseif ( !$l1 && $l2) {
                $val = $l2->val;
                $l2 = $l2->next;
            }
            $val += $carry;
            $carry = intval($val/10);
            $node = new ListNode($val%10);
            $node->next = $prev->next;
            $prev->next = $node;
        }

        return $prev->next;
    }

    function reverse($head) {
        $prev = null;

        while($head) {
            $next = $head->next;
            $head->next = $prev;
            $prev = $head;
            $head = $next;
        }
        
        return $prev;
    }
}

进阶(双栈):

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

    /**
     * @param ListNode $l1
     * @param ListNode $l2
     * @return ListNode
     */
    function addTwoNumbers($l1, $l2) {
        $st1 = $this->push_stack($l1);
        $st2 = $this->push_stack($l2);

        $carry = 0;
        $prev = new ListNode(0);
        while ( $st1 || $st2 || $carry) {
            $val = 0;
            if ($st1 && $st2) {
                $val = array_pop($st1) + array_pop($st2);
            } elseif ( $st1 && empty($st2)) {
                $val = array_pop($st1);
            } elseif ( empty($st1) && $st2) {
                $val = array_pop($st2);
            }
            
            $val += $carry;
            $carry = intval($val/10);
            $node = new ListNode($val%10);
            $node->next = $prev->next;
            $prev->next = $node;
        }

        return $prev->next;
    }

    function push_stack($head) {
        
        $res = [];
        while ($head) {
            array_push($res, $head->val);
            $head = $head->next;
        }

        return $res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值