兩數相加 c語言實現

2021-08-20 03:20:48 字數 1488 閱讀 3254

給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。

你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

輸出:7 -> 0 -> 8

原因:342 + 465 = 807

解題思路:我先開始的思路是,再建立乙個返回鍊錶,然後將兩個數的和放到返回鍊錶中返回,具體處理的時候,先檢查每一位相加時前面是不是有進製,如果有進製,則在相加的時候加上進製的值,在計算出每一位的和之後,如果和的值小於10,則沒有進製,進製標誌位false,進製值不做修改,如果有進製,則進製標誌位true,進製值做相應的修改。然後我的初始**如下:

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode* addtwonumbers(struct listnode* l1, struct listnode* l2)

else

}else

else

}l1=l1->next;

l2=l2->next;

if(l1||l2)

}while(l1)

else

}else

else

}l1=l1->next;

if(l1)

}while(l2)

else

}else

else

}l2=l2->next;

if(l2)

}if(carry)

return ret_list;

}

這明顯太長太長了,中間有非常多的重複**。然後我發現,我在計算carry_val(即進製值)的值得時候,要判斷是不是有進製,但是我發現,當有進製的時候temp/10,能計算出進製的值,但是,當沒有進製的時候,temp/10的值為0。這就為我提供了乙個新的解題方法。**如下:
struct listnode* addtwonumbers(struct listnode* l1, struct listnode* l2) 

}while(l1)

}while(l2)

}if(carry_val)

return ret_list;

}

可以看出,**量有了極大的簡化。但是還有很多重複**,於是我就又進行了改進,**如下:
struct listnode* addtwonumbers(struct listnode* l1, struct listnode* l2)  

if(!l1)

while(l1)

if(carry_val)

return ret_list;

}

這就很nice了,空間複雜度也極大的降低了。

2 兩數相加 C語言實現(leetcode)

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

C語言 兩數相加

給你兩個 非空 的鍊錶,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位 數字。請你將兩個數相加,並以相同形式返回乙個表示和的鍊錶。你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。題解 1,依次判斷l1節點是否為空,不為空取出l1節點的數值 2,依次...

兩數之和 c語言實現

題目描述 給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 解題思路 我原先想的是先將陣列的值儲存到乙個...