タイトル:2つの数値
元の質問へのリンク: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) {
ListNode *head = new ListNode();
ListNode *p = head;
int temp = 0;
while(l1 != NULL && l2 != NULL)
{
ListNode *q = new ListNode();
p->next = q;
p = p->next;
temp = l1->val + l2->val + temp;
if(temp < 10)
{
p->val = temp;
temp = 0;
}
else
{
p->val = temp - 10;
temp = 1;
}
l1 = l1->next;
l2 = l2->next;
}
while(l1 != NULL)
{
ListNode *q = new ListNode();
p->next = q;
p = p->next;
temp = l1->val + temp;
if(temp < 10)
{
p->val = temp;
temp = 0;
}
else
{
p->val = temp - 10;
temp = 1;
}
l1 = l1->next;
}
while(l2 != NULL)
{
ListNode *q = new ListNode();
p->next = q;
p = p->next;
temp = l2->val + temp;
if(temp < 10)
{
p->val = temp;
temp = 0;
}
else
{
p->val = temp - 10;
temp = 1;
}
l2 = l2->next;
}
if(temp == 1)
{
ListNode *q = new ListNode();
p->next = q;
p = p->next;
p->val = 1;
}
return head->next;
}
};
そして、これは公式の答えを見つけるために見て、彼女はリフレッシュに見え、明らかに時間エレガントなコードではありません。次のとおりです。
/**
* 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 *head = new ListNode();
ListNode *p = head;
int carry = 0;
while(l1 != NULL || l2 != NULL)
{
int x = (l1 != NULL)?l1->val:0;
int y = (l2 != NULL)?l2->val:0;
int sum = carry + x + y;
p->next = new ListNode(sum % 10);
p = p->next;
carry = sum / 10;
if(l1 != NULL) l1 = l1->next;
if(l2 != NULL) l2 = l2->next;
}
if(carry != 0)
p->next =new ListNode(1);
return head->next;
}
};
その公式のJavaを考えると、私はC ++に変換する彼を置きます。実際にはとても美しく見える〜
余談:
彼は、米国が書いた、その後、いくつかの言う「美しい花がないが、」そのような不満を持っていることが予想されて過ごすことになります言った:「両方の美しい花が美しい花ではありませんがあります」これは、誰もがテキストを表現呼び出すことはできません同意するように、基本的にナンセンスです。
-鈴木光司