
題目來源于leetcode第二題兩數相加。
題目描述
給出兩個非空的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式存儲的,并且它們的每個節點只能存儲一位數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
例如說
輸入:
2 4 3
5 6 4
輸出:
7 0 8
因為342 + 465 = 807
思路
這道題很好啊,用的是大數運算的思想也叫高精度。就是說一個鏈表存儲一個數,一個節點存一個數位,進行加法運算。
有三個需要注意的地方。首先是如果一個數已經沒下一位了就沒必要再繼續下去了,就像這樣

因為是鏈表我直接就把下一位的地址接過來了。
然后就是可能會有某種極端情況,一直有進位,還有就是會出現結果位數比加數多的可能。就像下面這樣。

代碼實現
struct ListNode { int val; struct ListNode *next; };#define CARRY(a,b) a=1,b-=10 //高精度加法 struct ListNode* addTwoNumbers(struct ListNode* num1, struct ListNode* num2) { int add= 0; //p是最后結果 struct ListNode* p; p = num1; //進行第一次運算 num1->val += num2->val + add; //有進位 if (num1->val > 9) { CARRY(add, num1->val); } while (NULL != num1->next&&NULL != num2->next) { num1 = num1->next; num2 = num2->next; num1->val += num2->val+add; add = 0; if (num1->val > 9) { CARRY(add, num1->val); } } if (!num1->next)num1->next = num2->next;0 //進行最后的進位運算31 while (add){32 if (!num1->next) {33 num1->next = (struct ListNode*)malloc(sizeof(struct ListNode));34 num1->next->next = NULL;35 num1->next->val = 0;36 }37 num1 = num1->next;38 num1->val++;39 add = 0;40 if (num1->val > 9) {41 CARRY(add, num1->val);42 }43 } 44 return p;45}