Add Two Numbers
Solution 1
每一个数字以一个逆序的链表形式输入,所以我们不需要考虑加法前的逆序操作,只需要注意按位加法的进位即可。
由于题目没有限制输入序列不等长的情形,因此需要额外判断是否有一个序列没有处理完,此外要注意最终是否有多出来的一个进位。
该思路与官方提供的解题思路的区别是将判断其中一个序列是否已经处理完放到了主循环内部,进行处理。
- 时间复杂度: O ( m a x ( m , n ) ) O(max(m, n)) O(max(m,n)), m m m和 n n n分别是两个序列的长度
- 空间复杂度: O ( m + n ) O(m + n) O(m+n), m m m和 n n n分别是两个序列的长度
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *head = NULL;
ListNode *l = NULL;
int carry = 0;
while(l1 != NULL && l2 != NULL) {
int sum = l1->val + l2->val + carry;
carry = sum / 10;
int value = sum % 10;
if(head == NULL) {
head = new ListNode(value);
l = head;
}
else{
l->next = new ListNode(value);
l = l->next;
}
l1 = l1->next;
l2 = l2->next;
}
while(l1 != NULL) {
int sum = l1->val + carry;
carry = sum / 10;
int value = sum % 10;
l->next = new ListNode(value);
l = l->next;
l1 = l1->next;
}
while(l2 != NULL) {
int sum = l2->val + carry;
carry = sum / 10;
int value = sum % 10;
l->next = new ListNode(value);
l = l->next;
l2 = l2->next;
}
if (carry != 0) {
l->next = new ListNode(carry);
}
return head;
}
};
solution 2
上一个解题思路的python实现
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
ans = ListNode()
now = ans
carry = 0
while l1 is not None and l2 is not None:
result = l1.val + l2.val + carry
carry = result // 10
value = result % 10
temp = ListNode(val=value)
now.next = temp
now = temp
l1 = l1.next
l2 = l2.next
while l1 is not None:
result = l1.val + carry
carry = result // 10
value = result % 10
temp = ListNode(val=value)
now.next = temp
now = temp
l1 = l1.next
while l2 is not None:
result = l2.val + carry
carry = result // 10
value = result % 10
temp = ListNode(val=value)
now.next = temp
now = temp
l2 = l2.next
if carry > 0:
temp = ListNode(val=carry)
now.next = temp
now = temp
ans = ans.next
return ans