2-Add Two Numbers @LeetCode

2-Add Two Numbers @LeetCode

題目

這裏寫圖片描述

思路

題目中得到的信息有:

  1. 這是兩個非負數,每位分別保存在鏈表的一個結點上;
  2. 逆序保存,從低位到高位依次。

一般整數的相加都是從低往高進行,和保存的順序一致,因此一次遍歷就可完成,可以看出這道題目不難。

C算法

/**
 * Definition for singly-linked list. 
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode *ret, *p, *prev;
    p = ret = prev = NULL;
    int flag = 0;
    //先是兩個整數相加
    while((l1 != NULL) && (l2 != NULL) ) { 
        p = (struct ListNode *)malloc(sizeof(struct ListNode));
        p->val = l1->val + l2->val + flag;
        flag = p->val / 10;
        p->val -= (flag > 0 ? 10 : 0);
        if (prev != NULL) prev->next = p;
        prev = p;
        if (ret == NULL) ret = p;
        l1 = l1->next;
        l2 = l2->next;
    }
    //若是l1還有結點,添加上去
    while(l1 != NULL) {
        p = (struct ListNode *)malloc(sizeof(struct ListNode));
         p->val = l1->val  + flag;
         flag = p->val / 10;
        p->val -= (flag > 0 ? 10 : 0);
        l1 = l1->next; 
         if (prev != NULL) prev->next = p;
        if (ret == NULL) ret = p;
        prev->next = p;
        prev = p;
    }
    //若是l2還有結點,添加上去
    while(l2 != NULL) {
        p = (struct ListNode *)malloc(sizeof(struct ListNode));
         p->val = l2->val  + flag;
         flag = p->val / 10;
        p->val -= (flag > 0 ? 10 : 0);
        l2 = l2->next; 
         if (prev != NULL) prev->next = p;
         if (ret == NULL) ret = p;
        prev->next = p;
        prev = p;
    }
    //最後可能會有進位,要考慮到
    if (flag != 0) {
        p = (struct ListNode *)malloc(sizeof(struct ListNode));
        p->val = flag;
        prev->next = p;
        prev = p;
        flag = 0;
    }
    prev->next = NULL;
    return ret;
}

結果

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章