【剑斩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;
    }
};
相关推荐
youngee112 小时前
hot100-54在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
草莓熊Lotso2 小时前
《算法闯关指南:递归,搜索与回溯算法--递归》--02. 合并两个有序链表,03. 反转链表
运维·数据结构·算法·链表
XFF不秃头2 小时前
力扣刷题笔记-和为 K 的子数组
c++·笔记·算法·leetcode
w-w0w-w2 小时前
【无标题】
c++
MicroTech20252 小时前
区块链赋能,联邦协同:微算法科技(NASDAQ: MLGO)打造物联网安全分布式检测新架构
科技·算法·区块链
1001101_QIA2 小时前
vector学习笔记
数据结构·算法
(❁´◡`❁)Jimmy(❁´◡`❁)2 小时前
【数据结构】 Treap1: 插入,删除,查找,旋转
数据结构·算法
枫叶丹42 小时前
【Qt开发】Qt事件(三)-> QMouseEvent 鼠标事件
c语言·开发语言·c++·qt·microsoft·计算机外设
core5122 小时前
ResNet 残差连接:通往深层网络的“高速公路”
人工智能·算法·resnet