ys memos

Blog

Leetcode 2 Add Two Numbers


leetcode

2020/05/23


ListNode* l1ListNode* 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;
  };

l1l2のどちらかでも値が存在する間ループし続ける。

  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を追加する。その時、l1l2ともに次のNodeが存在しない場合はループ終了。

    }else{
      if( !hasNext(l1) && !hasNext(l2) ) break;
      pushBack();
    }

連結リストを次へ進める。

    createdListNode = createdListNode->next;
    if(l1) l1 = l1->next;
    if(l2) l2 = l2->next;
  }

作成した加算済み連結リストを返す。

  return createdListHead;
}

関連タグを探す