2020/05/23
はじめに
ListNode* l1
、ListNode* l2
のそれぞれを1つの数値として考え、それらの和を求める問題
この時、リストの値は反転したものと考える。
<例>
L1 : 2 -> 4 -> 3
L2 : 5 -> 6 -> 4
Result : 7 -> 0 -> 8
Note : 342 + 465 = 807
コード全体
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* createdListNode = new ListNode;
ListNode* createdListHead = createdListNode;
auto hasNext = [](ListNode* node){
return node && node->next;
};
auto pushBack = [&createdListNode](){
ListNode* newNode = new ListNode;
createdListNode->next = newNode;
};
auto moveUp = [&createdListNode, &pushBack](){
pushBack();
createdListNode->val -= 10;
createdListNode->next->val += 1;
};
while(l1||l2){
if(l1) createdListNode->val += l1->val;
if(l2) createdListNode->val += l2->val;
if( createdListNode->val >= 10){
moveUp();
}else{
if( !hasNext(l1) && !hasNext(l2) ) break;
pushBack();
}
createdListNode = createdListNode->next;
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
return createdListHead;
}
解説
createdListNode
は、加算された数値を格納する連結リスト。
createdListHead
は、戻り値のために記憶したヘッド。
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* createdListNode = new ListNode;
ListNode* createdListHead = createdListNode;
hasNext()
は、「Nodeが次のNodeを持っているか?」を返すラムダ式。
auto hasNext = [](ListNode* node){
return node && node->next;
};
pushBack()
は、createdListNode
に次のNodeを追加するラムダ式。
auto pushBack = [&createdListNode](){
ListNode* newNode = new ListNode;
createdListNode->next = newNode;
};
moveUp()
は、createdListNode
の桁上げをするラムダ式。
この時、pushBack()
により次のNodeを追加しつつ桁上げする。
auto moveUp = [&createdListNode, &pushBack](){
pushBack();
createdListNode->val -= 10;
createdListNode->next->val += 1;
};
l1
、l2
のどちらかでも値が存在する間ループし続ける。
while(l1||l2){
l1
およびl2
に値が存在する場合は、createdListNode
に値を加算する。この時、桁上げは考慮しない。
if(l1) createdListNode->val += l1->val;
if(l2) createdListNode->val += l2->val;
createdListNode
の値が10以上である時、桁上げ処理を行う。
if( createdListNode->val >= 10){
moveUp();
桁上げを必要としない場合は、createdListNode
に次のNodeを追加する。その時、l1
・l2
ともに次のNodeが存在しない場合はループ終了。
}else{
if( !hasNext(l1) && !hasNext(l2) ) break;
pushBack();
}
連結リストを次へ進める。
createdListNode = createdListNode->next;
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
作成した加算済み連結リストを返す。
return createdListHead;
}