【剑斩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;
    }
};
相关推荐
The Chosen One98519 小时前
高进度算法模板速记(待完善)
java·前端·算法
土豆.exe21 小时前
Fastjson2 2.0.53 哈希碰撞 RCE:从原理到三种打法
算法·哈希算法
黄河123长江21 小时前
有限Abel群的结构()
算法
峥无1 天前
C++11 深度详解:现代 C++ 基石全梳理
开发语言·c++·笔记
阿米亚波1 天前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl
Jerry1 天前
LeetCode 92. 反转链表 II
算法
小王C语言1 天前
【3. 基于 Vibe Coding 的 OJ 平台】. 构建仓库、环境准备、需求梳理、安装依赖
网络·c++
骊城英雄1 天前
Rust从入门到精通-trait
人工智能·算法·rust
可编程芯片开发1 天前
基于PI控制算法的pwm直流电机控制系统Simulink建模与仿真
算法
小王C语言1 天前
【8.进行接口测试】:通过 curl 进行接口自动化测试 / 通过 python 程序进行接口自动化测试
网络·c++