leetcode #2-Add two Numbers[Medium]
Question
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Solution1[base]
time complecity: O(n)
space complecity: O(n)
runtime:53ms
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1_head, ListNode* l2_head) {
ListNode* l1_seq = l1_head;
ListNode* l2_seq = l2_head;
ListNode* l3_head = new ListNode(0);
ListNode* l3_seq = l3_head;
int carry = 0;
int sum = 0;
bool flag = true;
while (l1_seq->next != NULL && l2_seq->next != NULL) {
int l1_number = l1_seq->val;
int l2_number = l2_seq->val;
int add = l1_number+l2_number+carry;
sum = add%10;
carry = add/10;
// 第一次
if (flag == true) {
l3_seq->val = sum;
flag = false;
} else {
l3_seq->next = new ListNode(sum);
l3_seq = l3_seq->next;
}
l1_seq = l1_seq->next;
l2_seq = l2_seq->next;
}
// 最后一次两个都可以相加
int l1_number = l1_seq->val;
int l2_number = l2_seq->val;
int last_add = l1_number+l2_number+carry;
sum = last_add%10;
carry = last_add/10;
// 第一次
if (flag == true) {
l3_seq->val = sum;
flag = false;
} else {
l3_seq->next = new ListNode(sum);
l3_seq = l3_seq->next;
}
if (l1_seq->next == NULL && l2_seq->next == NULL && carry != 0) {
l3_seq->next = new ListNode(carry);
}
l1_seq = l1_seq->next;
l2_seq = l2_seq->next;
while (l1_seq != NULL) {
last_add = l1_seq->val+carry;
sum = last_add%10;
carry = last_add/10;
l3_seq->next = new ListNode(sum);
l3_seq = l3_seq->next;
l1_seq = l1_seq->next;
if (l1_seq == NULL && carry != 0) {
l3_seq->next = new ListNode(carry);
}
}
while (l2_seq != NULL) {
last_add = l2_seq->val+carry;
sum = last_add%10;
carry = last_add/10;
l3_seq->next = new ListNode(sum);
l3_seq = l3_seq->next;
l2_seq = l2_seq->next;
if (l2_seq == NULL && carry != 0) {
l3_seq->next = new ListNode(carry);
}
}
return l3_head;
}
};
思路:实现考虑了很多种情况:
l1有多个,l2有多个,不产生进位
l1有多个,l2有多个,产生进位
l1有一个,l2有多个,不产生进位
l1有一个,l2有多个,产生进位
….
所以代码很长,逻辑不清楚
Solution2[optimal]
time complecity: O(n)
space complecity: O(n)
runtime:51ms
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode preHead(0), *p = &preHead;
int extra = 0;
while (l1 || l2 || extra) {
int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + extra;
extra = sum / 10;
p->next = new ListNode(sum % 10);
p = p->next;
l1 = l1 ? l1->next : l1;
l2 = l2 ? l2->next : l2;
}
return preHead.next;
}
};
思路:将问题简化,考虑l1,l2和进位决定是否增加一个ListNode,虽然复杂度差不多,但是代码量大大减少。逻辑清晰