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;
}