LeetCode - 2.兩數相加

LeetCode - 2.兩數相加

題目

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 465 = 807

分析

這個題主要分析出什麼情況下需要增加一個節點,在鏈表1不爲空,鏈表2爲空時,需要創建一個新的節點,來承接鏈表1多出來的一位以及上一次循環進位的和;同理,鏈表2不爲空,鏈表1爲空,需要創建一個新的節點,來承接鏈表2多出來的一位以及上一次循環進位的和;還有,鏈表1與鏈表2都爲空了,但是上一次循環有進位,需要創建一個新的節點來承接進位數據。這三種情況下需要創建新節點。直到兩個鏈表都爲空停止循環,返回鏈表頭部。

題目不是很難,不過也被卡住了,心疼自己。。。
出現瞭如下錯誤
member access within misaligned address 0x000000000031 for type 'struct ListNode', which requires 8 byte alignment
原因最後返回的指針沒有指向NULL,所以最後一定要加上

lr->next = NULL;

題解

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* l1node = l1;
    struct ListNode* l2node = l2;
    //創建新的鏈表來表示求和
    struct ListNode* lr = (struct ListNode*)malloc(sizeof(struct ListNode));
    lr->val = 0;
    lr->next = NULL;
    //存儲頭部節點
    struct ListNode* rlr = lr;
    while(l1node!=NULL||l2node!=NULL){
        int l1val = 0;
        int l2val = 0;
        l1val = l1node == NULL ? 0 : l1node->val;
        l2val = l2node == NULL ? 0 : l2node->val;
        //對應位求和同時加上進位
        int sum = lr->val + l1val + l2val;
        lr->val = sum%10;
        if(l1node!= NULL){
            l1node = l1node->next;
        }
        if(l2node!= NULL){
            l2node = l2node->next;
        }
        struct ListNode* nl = (struct ListNode*)malloc(sizeof(struct ListNode));
        //進位
        nl->val = sum/10;
        //三種情況
        if(l1node != NULL || l2node != NULL || sum/10 != 0){
            lr->next = nl;
            lr = lr->next;
        }
    }
    //不能或略最終指向爲空
    lr->next = NULL;
    return rlr;
}

在這裏插入圖片描述
多噴噴纔能有長進啊,希望各位不要留情面,使勁懟我這亂七八糟的代碼。
補上之前的不足,靜下心來,積少成多,希望在大家的監督下,變得更強

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