【LeetCode]】add Two Numbers(兩單鏈表對應數值之和)
阿新 • • 發佈:2018-12-12
題目
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
思路
其實不用考慮別的,就是兩個數字相加,和傳統加法唯一的不同就是此題中的加法是從左往右算的,進位也是從左往右進。
例子裡給的就是
2 4 3
+ 5 6 4
——————————
7 0 8
正常加法應該先算3+4, 接著4+6,進一位,最後2+5,加之前的進位1,得到8;
在本題就應該先算 2+5, 接著4+6,進一位到3+4中,3+4+1=8,最後得到708。
對於兩個list不等長的情況,就把短的list的末尾用0補齊就行了。
所以我直接遍歷兩個連結串列了,取出來的數相加放到新表裡。當l1.next或者l2.next == null了,用0替代l1.val或l2.val。
最後還要注意當兩個連結串列都遍歷完,相加完之後,如果還有進位,要把進位的數字放到新list的末尾。比如 5 + 5 = 0->1
class Solution {
public:
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
if(l1 == NULL || l2 == NULL) return (l1 == NULL) ? l2 : l1;
ListNode* p1 = l1;
ListNode* p2 = l2;
int carry = 0 ,num;//進位,和
ListNode* res = new ListNode(-1);//頭結點
ListNode* p = res;
while(p1 != NULL || p2 != NULL || carry) {
num = (p1 ? p1->val : 0) + (p2 ? p2->val : 0) + carry;
carry = num >= 10 ? 1 : 0;
num %= 10;
ListNode* tmp = new ListNode(num);
p->next = tmp;
p = p->next;
if(p1) p1 = p1->next;
if(p2) p2 = p2->next;
}
return res->next;
}
};
};
####結語
初始走在通往IT的道路上,雖然充滿荊棘,但是隻要能幹倒這些荊棘,相信明天一定更美好!