/* 給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
示例: 輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 465 = 807
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* l3 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* n1 = l1;
struct ListNode* n2 = l2;
struct ListNode* n3 = l3;
int carry = 0;
while (1) {
int c1 = 0;
int c2 = 0;
if (n1 != NULL) {
c1 = n1->val;
n1 = n1 ->next;
}
if (n2 != NULL) {
c2 = n2->val;
n2 = n2 ->next;
}
int sum = c1 + c2 + carry;
carry = sum /10;
int currentValue = sum % 10;
n3->val = currentValue;
//考慮進位有值得情況需要進入下一個迴圈
if(n1 != NULL || n2 != NULL || carry)
{
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
n3->next = newNode;
n3 = n3 ->next;
}
else
{
//最後一個節點為NULL
n3 ->next = NULL;
break;
}
}
return l3;
}
複製程式碼
小結:程式導向的思路。 注意的幾個問題:
- 進位問題,低位相加得出進位值提供給高位計算。
- 最後一輪相加的時候可能會產生進位,這個時候需要進入下一輪迴圈,計算下一位的值。
待完善L('ω')┘三└('ω')」....