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;
}
多噴噴纔能有長進啊,希望各位不要留情面,使勁懟我這亂七八糟的代碼。
補上之前的不足,靜下心來,積少成多,希望在大家的監督下,變得更強