[LeetCode] Add Two Numbers
Add Two Numbers
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8
問題解決の考え方:
この問題には難点はありません.最後の進位の罠に注意すればいいです.私がしなければならないのは、結果をより完璧に表現する方法です.主にトップ加算と他のビット加算の違いを考慮する.最初はif文を使っていました.コードは次のとおりです.
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8
問題解決の考え方:
この問題には難点はありません.最後の進位の罠に注意すればいいです.私がしなければならないのは、結果をより完璧に表現する方法です.主にトップ加算と他のビット加算の違いを考慮する.最初はif文を使っていました.コードは次のとおりです.
/**
* 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* p = l1, *q=l2;
ListNode* result = new ListNode(0), *r=result; //r
int over = 0; //
bool first = true; //
while(p!=NULL&&q!=NULL){
int addNum = p->val + q->val + over;
// addNum [0, 19]
if(!first){
r->next=new ListNode(0);
r=r->next;
}
r->val = addNum % 10;
over = addNum / 10;
p=p->next;
q=q->next;
first = false;
}
if(q!=NULL){
p=q;
}
while(p!=NULL){
int addNum = p->val + over;
if(!first){
r->next=new ListNode(0);
r=r->next;
}
r->val = addNum % 10;
over = addNum / 10;
p=p->next;
first = false;
}
if(over!=0){
r->next=new ListNode(0);
r=r->next;
r->val = over;
}
return result;
}
};
ここでは、怠け者の布のように、分かりにくいです.そこで、第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* result = new ListNode(0), *r=result; //r
result->val = (l1->val + l2->val)%10;
int over = (l1->val + l2->val)/10;
ListNode* p = l1->next, *q=l2->next;
while(p!=NULL&&q!=NULL){
int addNum = p->val + q->val + over;
r->next=new ListNode(0);
r=r->next;
r->val = addNum % 10;
over = addNum / 10;
p=p->next;
q=q->next;
}
if(q!=NULL){
p=q;
}
while(p!=NULL){
int addNum = p->val + over;
r->next=new ListNode(0);
r=r->next;
r->val = addNum % 10;
over = addNum / 10;
p=p->next;
}
if(over!=0){
r->next=new ListNode(0);
r=r->next;
r->val = over;
}
return result;
}
};
は以前より少し良いですが、ここではl 1とl 2の少なくとも1つのノードがデフォルトであり、依然として美しくありません.第3版が出た./**
* 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* result = new ListNode(0), *r=result; //r
ListNode* p = l1, *q=l2;
int over = 0;
while(p!=NULL&&q!=NULL){
int addNum = p->val + q->val + over;
r->next=new ListNode(0);
r=r->next;
r->val = addNum % 10;
over = addNum / 10;
p=p->next;
q=q->next;
}
if(q!=NULL){
p=q;
}
while(p!=NULL){
int addNum = p->val + over;
r->next=new ListNode(0);
r=r->next;
r->val = addNum % 10;
over = addNum / 10;
p=p->next;
}
if(over!=0){
r->next=new ListNode(0);
r=r->next;
r->val = over;
}
r = result;
result = result->next;
delete r;
return result;
}
};
人はこのような処理方式が好きで、先にヘッダノードが設けられていて、その後の処理方式はすべて同じで、それからヘッダノードを削除します.