前言
这几天不是在写文章总结黑马点评吗,感觉敲代码的能力确实有点欠缺了,主要是敲项目代码的时候,接入了AI,大部分代码都是直接按Tab键自动生成的,代码能力确实有一点退步了🤪🤪🤪,这几天学学数据结构,刷刷题🏄🏄🏄,冲冲冲一天一道,(但是我感觉可能坚持不下去🤪)
题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
- 输入:l1 = [0], l2 = [0]
- 输出:[0]
示例 2:
- 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
- 输出:[8,9,9,9,0,0,0,1]
java
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//1. 创建哑节点, 方便处理链表头节点的边界情况
ListNode dummyHead = new ListNode(-1);
//2. 用cur指针遍历并构建结果链表
ListNode cur = dummyHead;
//3.temp存储进位值(0或1)
int temp = 0;
//4.循环条件: 只要l1,l2为遍历完就继续计算
while (l1 != null || l2 != null || temp != 0 ) {
//5. 取当前节点的值, 若节点为空则取 0
int val1 = l1 == null ? 0 : l1.val;
int val2 = l2 == null ? 0 : l2.val;
//6. 计算当前节位的总和 (当前两数 + 进位)
temp += val1;
temp += val2;
//7. 生成新节点, 存储当前的结果
ListNode node = new ListNode(temp % 10);
//8. 将新节点接入结果链表
cur.next = node;
//9.cur指针后移准备下一个节点
cur = cur.next;
//10. 更新进位
temp /= 10;
//11. 若l1不为空, 指针后移
if (l1 != null){
l1 = l1.next;
}
//12. 若l2不为空,指针后移
if (l2 != null){
l2 = l2.next;
}
}
return dummyHead.next;
}
💡 核心逻辑拆解
- 哑节点(dummyHead)
- 作用:避免单独处理结果链表的头节点,让代码更简洁。
- 最终返回 dummyHead.next,就是真正的结果链表。
- 进位处理(temp)
- 初始为 0,每次计算时累加当前两个节点的值和进位。
- temp % 10:得到当前位的数字(如 13 % 10 = 3)。
- temp /= 10:得到新的进位(如 13 / 10 = 1)。
- 遍历终止条件
- l1 != null || l2 != null || temp != 0:
- 只要还有节点没遍历完,或者还有进位(比如最后一位相加后仍有进位),就需要继续生成节点。
ListNode
java
public class ListNode {
// 节点存储的数据(比如数字、字符串等)
int val;
// 指向下一个节点的引用(相当于车厢的挂钩)
ListNode next;
// 构造方法:创建一个带数据的节点
public ListNode(int val) {
this.val = val;
this.next = null; // 默认下一个节点为空
}
}
- val:这个节点要存的具体数据(比如数字、字符串等)。
- next:一个「指向另一个 ListNode 对象」的引用,用来把节点串成链表。
- 如果 next = null,就代表这是链表的最后一个节点,后面没东西了。
小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)
...。。。。。。。。。。。...

...。。。。。。。。。。。...