[链表专题]两数相加 II

描述

本题是力扣的445. 两数相加 II

考点

  • 链表的合并

题解

class Solution {
 public:
  ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
   stack<int> list1, list2;
   while (l1 != nullptr) {
    list1.push(l1->val);
    l1 = l1->next;
   }
   while (l2 != nullptr) {
    list2.push(l2->val);
    l2 = l2->next;
   }
   int carry = 0;
   ListNode *dummyHead = new ListNode(-1);
   while (!list1.empty() || !list2.empty() || carry) {
    carry += !list1.empty() ? list1.top() : 0;
    carry += !list2.empty() ? list2.top() : 0;
    if (!list1.empty()) list1.pop();
    if (!list2.empty()) list2.pop();
    ListNode *node = new ListNode(carry % 10, dummyHead->next);
    dummyHead->next = node;
    carry /= 10;
   }
   return dummyHead->next;
  }
};

思路

按照算术逻辑,运算应该从低位到高位,同时用一个变量carry记录进位

那么新节点的值就等于 「(对应位之和+上一次运算的carry)取余10」, 进位carry的值就等于 「(对应位之和+上一次运算的carry)除以10」

故而正常思维,两个链表先反转并作运算,新的节点以头插的方式连接,这样就保证了逆序

class Solution {
private:
 ListNode* reverseFunc(ListNode* head) {
        //头插法反转链表
  ListNode *dummyHead = new ListNode(-1, head), *tail = head;
  while (tail->next != nullptr) {
   ListNode *node = tail->next;
   tail->next = node->next;
   node->next = dummyHead->next;
   dummyHead->next = node;
  }
  return dummyHead->next;
 }
public:
 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
  ListNode *dummyHead = new ListNode(-1);
  l1 = reverseFunc(l1);
  l2 = reverseFunc(l2);
  int carry = 0;
  while (l1 != nullptr || l2 != nullptr || carry) {
   carry += l1 != nullptr ? l1->val : 0;
   carry += l2 != nullptr ? l2->val : 0;
            //头插法新建链表即逆序
   ListNode *node = new ListNode(carry % 10, dummyHead->next);
   dummyHead->next = node;
   carry /= 10;
   l1 = l1 != nullptr ? l1->next : nullptr;
   l2 = l2 != nullptr ? l2->next : nullptr;
  }
  return dummyHead->next;
 }
};

但是题目竟然要求不反转链表?那就只能用栈了,代码如题解所示

两个链表的值先入栈,保证低位对低位;每次对应位出栈做运算,新的节点同样以头插的方式连接保证逆序

更多

恭喜你完成本题!

你可以选择继续下一题,或移步至仓库开始更多类型的挑战:https://fi3wey.github.io/

仓库内包含了更多经典案例的逻辑剖析与实现细节,助你在算法的学习之旅上一往无前!

看官若还满意,还请Star一下哟~

关注公众号峰狂算法,获取最新的刷题指导呀~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值