【剑斩OFFER】算法的暴力美学——两数相加

一、题目描述

二、算法原理

思路:模拟

因为本来我们是要把链表里面的值进行翻转的,但是题目已经帮我们翻转了,所以可以直接进行加法操作就行,不过要考虑进位问题,我们使用一个值 t 来保存这个两个链表加的值,假设 t = 12 ,那么这个最终的结果是:t % 10 = 2,此时进行进位操作: t = t / 10 = 1;然后不断的进行加法运算直到:运算到第一个和第二个链表的最后值,而且当 t != 0 时,代表着加法运算还没有结束。

三、代码实现

最佳实现:

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int t = 0;//进位值
        ListNode* newhead = new ListNode(0);//一个新链表的头结点,这个头结点用于返回新链表的第一个值
        ListNode* cur1 = l1,*cur2 = l2;
        ListNode* prev = newhead;//链表的最后一个结点,用于链接加入的值
        
        while(cur1 || cur2 || t)//只要符合其中的任意一个条件,就代表着这个链表没有结束加法运算
        {
            if(cur1)
            {
                t += cur1->val;
                cur1 = cur1->next;
            }

            if(cur2)
            {
                t += cur2->val;
                cur2 = cur2->next;
            }

            prev->next = new ListNode(t % 10);//链接新的结点,保存该位的值
            prev = prev->next;//尾结点进行更新
            t = t / 10;//保存进位值
        }

        return newhead->next;
    }

};

代码探索:

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* phead = new ListNode;
        phead->next = nullptr;
        ListNode* cur1 = l1,*cur2 = l2;
        ListNode* phead_tmp = phead;
        int tmp = 0;
        while(cur1 != nullptr && cur2 != nullptr)
        {
            tmp += cur1->val + cur2->val;
            ListNode* node = new ListNode;
            node->val = tmp % 10;
            node->next = nullptr;
            phead_tmp->next = node; 
            phead_tmp = node;
            node = nullptr;
            tmp /= 10;
            cur1 = cur1 -> next;
            cur2 = cur2 -> next;
        }
        while(cur1 != nullptr)
        {
            tmp += cur1->val;
            ListNode* node = new ListNode;
            node->val = tmp % 10;
            node->next = nullptr;
            phead_tmp->next = node;
            phead_tmp = node;
            node = nullptr;
            tmp /= 10;
            cur1 = cur1->next;
        }

        while(cur2 != nullptr)
        {
            tmp += cur2->val;
            ListNode* node = new ListNode;
            node->val = tmp % 10;
            node->next = nullptr;
            phead_tmp->next = node;
            phead_tmp = node;
            node = nullptr;
            tmp /= 10;
            cur2 = cur2->next;
        }

        if(tmp)
        {
            ListNode* node = new ListNode;
            node->val = tmp;
            node->next = nullptr;
            phead_tmp->next = node;
            node = nullptr;
        }

        return phead->next;
    }
};
相关推荐
沉淀的.晴天19 分钟前
FreeRTOS信号量
数据结构·算法
青山木1 小时前
Hot 100 --- 打家劫舍
java·数据结构·算法·leetcode·动态规划
云边有个稻草人1 小时前
Tera Term 鸿蒙 PC 适配全记录:用 ArkUI 与 Native C++ 重建多协议终端工作流
c++·stm32·harmonyos
牛油果子哥q1 小时前
多模态大模型工程入门:图文Embedding、图文RAG、图片解析、C++多模态接口封装实战
开发语言·c++·embedding
机器学习之心1 小时前
均值、中值、圆周期:三种 InSAR 干涉相位滤波的实测对比与参数取舍
算法·均值算法
xy20261 小时前
多轮 Tool Agent 训不动?先把环境 token 从 loss 里拿掉
算法
wzdark1 小时前
多核架构下算法并行化的瓶颈与突破点4
算法·架构
阿明62 小时前
Leetcode: 283. 移动零
算法·leetcode·职场和发展
葫三生2 小时前
三生原理与《涌现:从简单规则到复杂世界》在“简单规则生成复杂系统”核心思路上存在理论呼应?
人工智能·科技·算法·机器学习·开源
6Hzlia2 小时前
【Classic 150 刷题计划】 LeetCode 134. 加油站 | C++ 贪心算法与局部否决逻辑
c++·leetcode·贪心算法