【LeetCode】2. 两数相加
解题思路
因为两个链表都是逆序的,所以可以直接遍历这两个链表,逐位相加。设两个链表当前位置的数字为 x,y,进位值为 carry,和为 sum,则 sum = x + y + carry,新的进位值 carry = sum / 10,答案链表相应位置的数字为 sum % 10。如果两个链表的长度不同,就在短链表的末尾补0。
代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode curr = dummyHead;
int carry = 0;
while (l1 != null || l2 != null || carry > 0) {
int x = l1 == null ? 0 : l1.val;
int y = l2 == null ? 0 : l2.val;
int sum = x + y + carry;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
return dummyHead.next;
}
}
复杂度分析
- 时间复杂度:O(max(M,N)),其中M,N为两个链表的长度。
- 空间复杂度:O(max(M,N)),其中M,N为两个链表的长度,答案链表的长度为长链表的长度+1。