题目:两数相加
原题链接:两数相加
这个题不复杂,但是我觉得解决同一个问题代码量却很能体现一个人的编程水平:
自己第一次做的代码量是这样子的(不忍直视~~):
/**
* 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++。看起来真的相当优美~~
题外话:
说花美就会有人说“也有不美的花”,预想到会有这种抱怨,于是写:“既有美丽的花也有不美的花”。这基本是废话,令所有人都认同的文字称不上表达。
——铃木光司