
该代码的算法思想如下:
1. 定义节点和初始化
我们首先定义一个 ListNode 类来表示链表的节点。然后在 addTwoNumbers 方法中创建一个哑节点 dummyHead,用于简化结果链表的操作。carry 初始化为0,用于保存进位信息。p 和 q 分别指向输入链表 l1 和 l2 的头节点,curr 指向结果链表的当前节点。
2. 遍历链表
我们使用 while 循环同时遍历 l1 和 l2,直到两个链表都遍历完:
- 获取节点值:对当前节点的值分别用
x和y保存,如果节点为null,则用0代替。 - 计算和及进位:计算
x、y和carry的和,将该值存入sum。carry更新为sum / 10,表示进位部分。 - 创建新节点:将
sum % 10的结果作为新节点的值,并将新节点连接到curr.next,然后将curr指向新的节点。
3. 处理剩余进位
当 l1 和 l2 都遍历完之后,如果 carry 还大于0,则说明最高位还有进位,因此我们创建一个新的节点并赋值为 carry。
4. 返回结果链表
最后返回 dummyHead.next,它指向的是结果链表的头节点。
核心思想
此算法的核心思想是逐位相加链表的每个节点,类似于从最低位到最高位进行“手算”加法。每次加法操作都会考虑上一位的进位,并更新进位给下一位。这样,整个链表的相加操作就可以在一次遍历内完成。
这种做法的时间复杂度是 (O(\max(m, n))),其中 m 和 n 是链表 l1 和 l2 的长度,因为我们只需遍历一次较长的链表。
java 实现
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode p = l1;
ListNode q = l2;
ListNode curr = dummyHead;
//需要进位变量
int carry = 0;
while(p != null || q!= null) { //这里是或条件
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int sum = x + y + carry;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
//p,q往后移动
if(p != null) p = p.next;
if(q != null) q = q.next;
}
//此时 p,q 所有节点都处理完了
if(carry > 0) {
curr.next = new ListNode(carry);
}
return dummyHead.next;
}
}

3372

被折叠的 条评论
为什么被折叠?



