diff --git a/链表/7. 两数相加.md b/链表/7. 两数相加.md new file mode 100644 index 0000000..b8fbf6c --- /dev/null +++ b/链表/7. 两数相加.md @@ -0,0 +1,84 @@ +# 两数相加 + +## 题目 + +给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 + +请你将两个数相加,并以相同形式返回一个表示和的链表。 + +你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 + + + +示例 1: + + +输入:l1 = [2,4,3], l2 = [5,6,4] +输出:[7,0,8] +解释:342 + 465 = 807. +示例 2: + +输入:l1 = [0], l2 = [0] +输出:[0] +示例 3: + +输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] +输出:[8,9,9,9,0,0,0,1] + + +提示: + +每个链表中的节点数在范围 [1, 100] 内 +0 <= Node.val <= 9 +题目数据保证列表表示的数字不含前导零 + + + +## 思路 + +- 迭代 + - 注意进位 + - 注意 null 按照 0 处理 + +## 代码 + +```java +/** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode() {} + * ListNode(int val) { this.val = val; } + * ListNode(int val, ListNode next) { this.val = val; this.next = next; } + * } + */ +class Solution { + public ListNode addTwoNumbers(ListNode l1, ListNode l2) { + // Init: DummyHead, cur, carry + ListNode dummyHead = new ListNode(-1); + ListNode cur = dummyHead; + int carry = 0; + // Traverse: Add + while (l1 != null || l2 != null) { + int val1 = l1 == null ? 0 : l1.val; + int val2 = l2 == null ? 0 : l2.val; + int sum = val1 + val2 + carry; + carry = sum / 10; + sum %= 10; + cur.next = new ListNode(sum); + cur = cur.next; + l1 = l1 == null ? null : l1.next; + l2 = l2 == null ? null : l2.next; + + } + // Operator: After + if (carry > 0) { + cur.next = new ListNode(carry); + cur = cur.next; + } + + return dummyHead.next; + } +} +```