一, 题目
给出两个 非空 的链表用来表示两个非负的整数. 其中, 它们各自的位数是按照 逆序 的方式存储的, 并且它们的每个节点只能存储 一位 数字.
如果, 我们将这两个数相加起来, 则会返回一个新的链表来表示它们的和.
您可以假设除了数字 0 之外, 这两个数都不会以 0 开头.
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
原因: 342 + 465 = 807
二, 题解
特殊情况:
1) 一个链表比另一个链表长;
2) 一个链表为空, 另一个链表不为空;
3) 求和运算可能出现进位.
具体步骤:
1) 设置一个哑节点, 并将当前节点初始化为这个哑节点;
2) 将进位 carry 初始化为 0;
3) 遍历列表 l1 和 l2 直至到达它们的尾端:
1 将 x 设为 l1 的节点. 如果 x 已经到达 l1 的末尾, 则将其值设置为 0;
2 将 y 设为 l2 的节点. 如果 y 已经到达 l2 的末尾, 则将其值设置为 0;
3 和为 Sum = x + y + carry;
4 更新进位的值 carry = Sum / 10;
5 和对 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;
- }
来源: https://www.cnblogs.com/sunshineliulu/p/12702661.html