【剑斩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;
    }
};
相关推荐
2401_851272993 分钟前
自定义内存检测工具
开发语言·c++·算法
☆56624 分钟前
C++中的命令模式
开发语言·c++·算法
仰泳的熊猫26 分钟前
题目2577:蓝桥杯2020年第十一届省赛真题-走方格
数据结构·c++·算法·蓝桥杯
CoovallyAIHub1 小时前
Pipecat:构建实时语音 AI Agent 的开源编排框架,500ms 级端到端延迟
深度学习·算法·计算机视觉
灰色小旋风1 小时前
力扣13 罗马数字转整数
数据结构·c++·算法·leetcode
2301_810160951 小时前
C++与物联网开发
开发语言·c++·算法
cm6543201 小时前
基于C++的操作系统开发
开发语言·c++·算法
ArturiaZ1 小时前
【day57】
开发语言·c++·算法
CoovallyAIHub1 小时前
Energies | 8版YOLO对8版Transformer实测光伏缺陷检测,RF-DETR-Small综合胜出
深度学习·算法·计算机视觉
Emberone1 小时前
排序:万物皆有序
算法·排序算法