题目描述
给定两个非空链表来代表两个非负整数,位数按照从低位到高位方式存储,它们的每个节点只存储一个数字。将这两数相加,返回一个新的链表。
假设除了数字 0 之外,这两个整数都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
注意:1.题目里虽然说了是非空链表,但测试用例里面还是会有空链表;
2.两个链表的长度不一定一样;
解题思路和解法
时间复杂度为O(max(m,n)),m为第一个链表的长度,n为第二个链表的长度;
空间复杂度为O(max(m,n)),因为存储结果的链表最长为max(m,n)+1;
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode p = l1, q = l2, curr = dummyHead;
int carry = 0; //存储进位
while (p != null || q != null) { //不断循环,直到两个链表都为空
int x = (p != null) ? p.val : 0; //如果链表为空,设置当前值为0
int y = (q != null) ? q.val : 0;
int sum = carry + x + y; //注意,这里加了进位
carry = sum / 10; //计算新的进位
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
if (carry > 0) {
curr.next = new ListNode(carry); //最后,进位值可能不为0
}
return dummyHead.next; //注意这里的.next
}