LeetCode#2-Add Two Numbers-两数相加
一、题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
二、题解
特殊情况:
1)一个链表比另一个链表长;
2)一个链表为空,另一个链表不为空;
3)求和运算可能出现进位。
具体步骤:
1)设置一个哑节点,并将当前节点初始化为这个哑节点;
2)将进位 carry 初始化为 0;
3)遍历列表 l1 和 l2 直至到达它们的尾端:
① 将 x 设为 l1 的节点。如果 x 已经到达 l1 的末尾,则将其值设置为 0;
② 将 y 设为 l2 的节点。如果 y 已经到达 l2 的末尾,则将其值设置为 0;
③ 和为 Sum = x + y + carry
;
④ 更新进位的值 carry = Sum / 10
;
⑤ 和对 10 取余,Sum = Sum % 10
;创建这个结果的节点,并将其设置为当前结点的下一个节点,同时将当前节点前进到下一个节点;
4)如果两个链表全部遍历完毕后,进位值 carry = 1,则在新链表最前方添加节点 1;
5)返回哑节点的下一个节点。
时间复杂度:O(n),空间复杂度:O(n)。
function addTwoNumbers($l1, $l2) {
$carry = 0;
$dummyHead = new ListNode(0);
$cur = $dummyHead;
while ($l1 !== null || $l2 !== null) {
echo $carry . "<br>";
$x = $l1 == null ? 0 : $l1->val;
$y = $l2 == null ? 0 : $l2->val;
$sum = $carry + $x + $y;
$carry = floor($sum / 10);
$sum = $sum % 10;
$cur->next = new ListNode($sum);
$cur = $cur->next;
if ($l1 !== null) {
$l1 = $l1->next;
}
if ($l2 !== null) {
$l2 = $l2->next;
}
}
if($carry == 1) {
$cur->next = new ListNode($carry);
}
return $dummyHead->next;
}