每日算法——letcode系列
標簽: 算法 C++ LetCode
問題 Add Two Numbers
Difficulty: Medium
You are given two linked lists representing two non-negative numbers. 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.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
/**
* 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) {
}
};
翻譯
兩鏈表對應數之和
難度系數:中等
給定兩個由正整數組成的鏈表,數在鏈表中是倒序存放的,并且每個節點上的數是一位整數。把這兩上鏈表上的數相加并返回一個鏈表
輸入: (2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出: 7 -> 0 -> 8
思路
題中為什么說倒序,因為如果(2 -> 4 -> 3)看成一個數應該是243,如果跟(5 -> 6 -> 4)564相加應該得807,但由于是倒序放的,應該先從高位相加。
注意的是,題中沒有說兩個鏈表長度相同,我認為應該適應長度不相同的時候,還有就是相加后的鏈表有可能多一位。
代碼
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (l1 == nullptr && l1 == nullptr){
return nullptr;
}
ListNode* head = nullptr, **temp = &head;
int carry = 0;
while (l1 != nullptr || l2 != nullptr) {
int a = getValAndMoveToNext(l1);
int b = getValAndMoveToNext(l2);
int newVal = (a + b + carry) % 10;
carry = (a + b + carry) / 10;
ListNode* node = new ListNode(newVal);
*temp = node;
temp = &node->next;
}
// 最后當carrry大于0(為1)時,應該進一位
if (carry > 0){
ListNode* node = new ListNode(carry);
*temp = node;
}
return head;
}
private:
int getValAndMoveToNext(ListNode* &l){
if (l == nullptr){
return 0;
}
int x = 0;
x = l->val;
l = l->next;
return x;
}
};