給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。
你可以假設除了數字 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 解題思路 我原先想的是先將陣列的值儲存到乙個...