タイトル説明
我々は2つの非空リストは二つの非負整数を表すために使用されて示されています。ここで、それぞれのビットは、方法の逆の順序で格納され、それらは各ノードが一つだけ桁を格納することができます。
我々はこれらの2つの数値を合計した場合、それは新しいリストを返しますし、それらを表現します。
あなたは数字0に加えて、これらの二つの数字が0で始まっていないと仮定することができます。
入力:(2 - > 4 - > 3)+(5 - > 6 - > 4)
出力:7 - > 0 - > 8
原因:342 + 465 = 807
アイデア1
- すべてのコードを使い果たすのすべての種類によって書き込み可能メモリ(これは、最初に発生したとき)の限界を超えた、私は無限ループに陥っ過度に繰り返し問題解決の議論の分類を検討する際の状況は可能であると感じ
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* res = new ListNode(0);
ListNode* cur = res;
ListNode* pre = NULL;
int carry = 0;
while(l1 != NULL && l2 != NULL){
cur -> val = l1 -> val + l2 ->val + carry;
carry = cur -> val /10;
cur -> val = cur -> val % 10;
cur -> next = new ListNode(0);
pre = cur;
cur = cur -> next;
l1 = l1 -> next;
l2 = l2 -> next;
}
while(l1 != NULL){
cur -> val = l1 -> val + carry;
carry = cur -> val /10;
cur -> val = cur -> val % 10;
cur -> next = new ListNode(0);
pre = cur;
cur = cur -> next;
l1 = l1 -> next;
}
while(l2 != NULL){
cur -> val = l2 -> val + carry;
carry = cur -> val /10;
cur -> val = cur -> val % 10;
cur -> next = new ListNode(0);
pre = cur;
cur = cur -> next;
l1 = l2 -> next;
}
if(carry == 0){
pre -> next = NULL;
}
else{
cur -> val = carry;
}
return res;
}
};
アイデア2
- 他の人のコードを見て説明することで、元のメソッドとキャリーハンドルの問題を少し改善され、次のように、コードは次のとおりです。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int n1,n2,n3;
// 初始化进位符为0
int c = 0;
ListNode* r = NULL;
ListNode* current = NULL;
while(l1!= NULL || l2!= NULL){
// 取数操作
if (l1 == NULL){
n1 = 0;
}else {
n1 = l1 -> val;
l1 = l1 -> next;
}
if (l2 == NULL){
n2 = 0;
}else {
n2 = l2 -> val;
l2 = l2 -> next;
}
// 当前位两个数相加的和,带上进位符c
n3 = n1+n2+c;
// 相加完成,进位符归0
c = 0;
// 若每位的两个数相加的和大于9,则,c=1
if (n3 > 9){
n3 %= 10;
c = 1;
}
// 存数操作
if (r == NULL) {
r = new ListNode(n3);
current = r;
}
else {
current -> next = new ListNode(n3);
current = current -> next;
}
}
// 最后如果输入的两个ListNode都遍历完了,但是进位符c还为1,说明需要再进一位,则在返回的r后再添加1
if (c == 1){
current -> next = new ListNode(1);
}
return r;
}
};