leetcode 2 -- Add Two Numbers
leetcode 2 – 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
題意:2つのチェーンテーブル、各ノードは1つの非負の値を保存してしかも0-9で、2つのチェーンテーブルを加算してそしてキャリーを含んで、上のInputの4と6ノードが対応することを見て、4+6=10で、だから1は次のノードにキャリーして、現在のノードと10の余剰数0、最終的に合計した後の1つのチェーンテーブルに戻ります.簡単に言えば、この問題は巨大数の加算に似ていて、チェーンテーブルで実現されています.
考え方:私の考えはその中の1つのチェーンテーブルを借りて返すことができて、もう1つのチェーンテーブルの対応する値を加えて、新しい和を求めるチェーンテーブルを作成していないで、比較的に空間を節約して、注意しなければならない点は1です.どのチェーン時計が長いか分かりません.2.[9,9,9,9,9]および[1]のような循環キャリーがある可能性があり、結果は[0,0,0,0,1]である.3.最後のノードにキャリーがあるかどうかに注意し、newの新しいノードが必要になる場合があります.
コード:
タイトル: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
題意:2つのチェーンテーブル、各ノードは1つの非負の値を保存してしかも0-9で、2つのチェーンテーブルを加算してそしてキャリーを含んで、上のInputの4と6ノードが対応することを見て、4+6=10で、だから1は次のノードにキャリーして、現在のノードと10の余剰数0、最終的に合計した後の1つのチェーンテーブルに戻ります.簡単に言えば、この問題は巨大数の加算に似ていて、チェーンテーブルで実現されています.
考え方:私の考えはその中の1つのチェーンテーブルを借りて返すことができて、もう1つのチェーンテーブルの対応する値を加えて、新しい和を求めるチェーンテーブルを作成していないで、比較的に空間を節約して、注意しなければならない点は1です.どのチェーン時計が長いか分かりません.2.[9,9,9,9,9]および[1]のような循環キャリーがある可能性があり、結果は[0,0,0,0,1]である.3.最後のノードにキャリーがあるかどうかに注意し、newの新しいノードが必要になる場合があります.
コード:
/** * 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) {
//p q
ListNode *head = NULL, *p, *q;
ListNode *head1 = l1, *head2 = l2;
int t;
//bef , 0
int bef = 0;
//
while(l1 != NULL && l2 != NULL){
t = l1->val + l2->val + bef;
// 10, 1, 0
if(t >= 10){
l1->val = t%10;
bef = 1;
}else{
l1->val = t;
bef = 0;
}
//
p = l1;
q = l2;
l1 = l1->next;
l2 = l2->next;
}
head = head1;
/* l1 , l1 l2 , l1 next l2 l1 */
//
if(l1 == NULL && l2 == NULL){
if(bef == 1){
p->next = new ListNode(bef);
}
}else if(l1 == NULL || l2 == NULL){
// l1 l2
if(l1 == NULL)
p->next = q->next;
//
while(p->next != NULL){
p->next->val += bef;
if(p->next->val >= 10){
p->next->val %= 10;
p = p->next;
bef = 1;
}else{
bef = 0;
break;
}
}
// new
if(bef == 1){
p->next = new ListNode(1);
}
}
return head;
}
};