class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = null, tail = null;
int carry = 0;
while (l1 != null || l2 != null) {
int n1 = l1 != null ? l1.val : 0;
int n2 = l2 != null ? l2.val : 0;
int sum = n1 + n2 + carry;
if (head == null) {
head = tail = new ListNode(sum % 10);
} else {
tail.next = new ListNode(sum % 10);
tail = tail.next;
}
carry = sum / 10;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
if (carry > 0) {
tail.next = new ListNode(carry);
}
return head;
}
}
这里使用了两个指针 head 和 tail 来构建结果链表。carry 变量用来记录进位值。首先初始化 head 和 tail 为 null,carry 为 0。
然后进入循环,直到 l1 和 l2 都为 null,循环中,分别获取 l1 和 l2 当前节点的值 n1 和 n2。将 n1、n2 和 carry 相加得到 sum。
如果 head 为 null,说明是结果链表的第一个节点,此时创建一个新节点,并让 head 和 tail 都指向这个节点。否则,将新节点接在 tail 的后面,并将 tail 移动到新节点。
把 sum 的个位数添加到结果链表中,并更新 carry 为 sum 的十位数。
如果 l1 不为 null,将 l1 指针移到下一个节点。如果 l2 不为 null,将 l2 指针移到下一个节点。
循环结束后,如果 carry 大于 0,说明还有进位,需要在结果链表的末尾添加一个新节点。
最后返回结果链表 head。
这段代码的时间复杂度为 O(max(m,n)),其中 m 和 n 分别是链表 l1 和 l2 的长度。