445. 两数相加 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;
}
}