主要部分**
一兩周之前剛接觸結構體struct,這個兩數相加的程式還是讓我get到了很多。示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)1.在使用malloc分配動態記憶體的時候,需要給他「一整套」。輸出:7 -> 0 -> 8
原因:342 + 465 = 807
struct listnode
;struct listnode *l3 =
(struct listnode*
)malloc
(sizeof
(struct listnode));
//l3->val = 0; l3->next = null;
如上**,如果單單只有第一句使用malloc分配動態記憶體的語句,是不夠的,執行起來會出現如下報錯:
line 70: char 15: runtime error: member access within misaligned address 0xbebebebebebebebe for type 『struct listnode』, which requires 8 byte alignment (listnode.c)但是我們在給了他"空房子"之後,把"家具"都填進去,如:0xbebebebebebebebe: note: pointer points here
< memory cannot be printed >
struct listnode *l3 =
(struct listnode*
)malloc
(sizeof
(struct listnode));
l3->val =
0; l3->next =
null
;
問題就解決了。
2.情況多樣化的考慮
在考慮最後一種情況的時候,我想到了類似1+9,卻沒有想到1+99,1+999之類,致使程式在執行到 99+1這個測試用例的時候輸出了錯誤的測試用例。3.其他不足的就是程式執行用時較長;但是相應的執行消耗記憶體卻是超過了100%的其他c程式。
語言:c
一些引數的定義
struct listnode *l3 =
(struct listnode*
)malloc
(sizeof
(struct listnode));
l3->val =
0; l3->next =
null
;struct listnode* h1 = l1,
* h2 =l2,
* h3 = l3;
int flag =
0;
對相同位數的對應部分進行處理
while
(h1 && h2)
h3->val +
=(h1->val + h2->val);if
(h3->val >=10)
h1 = h1->next;
h2 = h2->next;if(
(h1 || h2)
&&!h3->next)
}
考慮如果兩個n為相加最後為n+1位的情況
if
(!h1 &&
!h2 && flag)
}
考慮第乙個或者第二個數長出來的部分
if
(h1)
h1 = h1->next;if(
!h3->next && h1)
if(h1) h3 = h3->next;}if
(flag &&
!h3->next)
}}
這次寫的**有些亂七八糟,還要繼續努力學習!
遇到了不同的測試用例,然後這邊補一下,那邊補一下。這是乙個挺不好的習慣,以後要把情況都考慮清楚。在寫到blog末尾的時候,我想,這道題的**大可不必如此冗長。乙個新思路跳出了腦海:其次就是對結構體不是特別掌握,導致了執行時頻繁的執行錯誤。
把鏈1全部複製到鏈3上,然後把鏈2乙個乙個結點往鏈3上面加如此一來,不論是進製或者是動態記憶體的分配都顯得清晰明了。
leetcode 2(兩數相加)C
鍊錶 可以改變長度,在刪除物件的時候會自動釋放記憶體,占用的記憶體空間也不需要連續。鍊錶是用 listnode 結點構成的,這些結點之間用指標鏈結。最簡單的單向鍊錶 每個結點代表兩個東西 1.它自己的值value 2.指向下乙個結點的指標next。next為空時,表示是鍊錶的最後乙個結點。p val...
LeetCode2 兩數相加 c
題目描述 給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。思路 遍歷兩個鍊錶,判斷兩數相加...
LeetCode2 兩數相加
嗯。今天兩個簡單題,我可能要墮落了 先貼第乙個 給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8原因 342 465 807...