【剑斩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;
    }
};
相关推荐
blasit21 分钟前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
AI软著研究员41 分钟前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish1 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱2 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者18 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮18 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者19 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考19 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript