1. 程式人生 > >【LeetCode]】add Two Numbers(兩單鏈表對應數值之和)

【LeetCode]】add Two Numbers(兩單鏈表對應數值之和)

題目

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的道路上,雖然充滿荊棘,但是隻要能幹倒這些荊棘,相信明天一定更美好!