题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]
考察点
- 链表的基础创建和移动;
- 高精度的加法:进位、补位等;
参考资料
2022-10-18 10:37:06
Time complexity: O(max(m,n))。其中 mm 和 nn 分别为两个链表的长度。
Space complexity: O(1)。注意打印值不计入空间复杂度。
如果只是返回值的话,那么就是O(max(m,n))。
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int sum = 0;
ListNode tail = new ListNode(0);
ListNode dummy = tail;
while (l1 != null || l2 != null || sum > 0) {
sum = sum + ( l1 == null ? 0 : l1.val) + ( l2 == null ? 0 : l2.val);
tail.next = new ListNode(sum % 10);
tail = tail.next;
if (l1 != null ) l1 = l1.next;
if (l2 != null ) l2 = l2.next;
sum = sum / 10;
}
return dummy.next;
}
}
2022年12月6日14:00:43
错误点
-
没考虑到链表的移动完后的遍历情况,即没有使用一个前置指针方便处理完后进行获取
// 错误代码如下: ListNode node= new ListNode(0); while (l1 != null || l2 != null){ // ... node = node.next; } return node.next;
-
没考虑到链表 l1 和 l2 的长度不一致的情况,即:
// 错误写法: l1 = l1.next; l2 = l2.next; // 正确写法: if (l1 != null) l1 = l1.next; if (l2 != null) l2 = l2.next;
-
在链表的计算以及补位错误
// 错误,在进位的时候,就对进制值又进行了一次运算,不再是上一个进位值了 temp = (x + y + temp) / 10; fast.next = new ListNode((x + y + temp) % 10); // 正确 sum = x + y + temp; temp = (sum) / 10; fast.next = new ListNode((sum) % 10);
-
没有考虑到会有最后一个进位的数据
// 即,缺少这两行代码 if (temp == 1){ fast.next = new ListNode(temp); }
优点
- 对链表的创建、初始化有了了解,但是还不够深刻;
- 对于数值的进位以及补位的知识还不错
未来优化:
- 多考虑一些特殊情况的影响;
- 链表以后在Leetcode上编写
代码最终优化后的展示
public class Dewv {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int x = 0;
int y = 0;
int temp = 0;
int sum = 0;
ListNode slow = new ListNode(0);
ListNode fast = slow;
while (l1 != null || l2 != null){
x = l1 == null ? 0 : l1.val;
y = l2 == null ? 0 : l2.val;
sum = x + y + temp;
temp = (sum) / 10;
fast.next = new ListNode((sum) % 10);
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
fast = fast.next;
}
// 确保最后一个进位加入到ListNode里面
if (temp == 1){
fast.next = new ListNode(temp);
}
return slow.next;
}
public static void main(String[] args) {
Dewv dewv = new Dewv();
ListNode node1 = new ListNode( 2, new ListNode(4, new ListNode(3)));
ListNode node2 = new ListNode( 5, new ListNode(6, new ListNode(4)));
ListNode node = dewv.addTwoNumbers(node1, node2);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("此时,链表结构为:");
while (node != null) {
stringBuilder.append("结点 :" + node.val + " --> ");
node = node.next;
}
System.out.println(stringBuilder.toString());
}
}