IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode刷题-2.两数相加 -> 正文阅读

[数据结构与算法]leetcode刷题-2.两数相加

https://leetcode.cn/problems/add-two-numbers/

解法一: 使用模版模式 解法,抽离变化,流程模版化, 有点多此一举的意思
解法二,三: 常用逻辑, 清晰

/*
 * @lc app=leetcode.cn id=2 lang=cpp
 *
 * [2] 两数相加
 */
// C
#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#if __cplusplus >= 201103L
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
// #include <cstdalign>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#endif
// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <type_traits>
#include <typeindex>
#include <unordered_map>
#include <unordered_set>
#endif
using namespace std;
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) {}
};
// @lc code=start
/**
 * 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:
    class AddListNodeAbs {
       private:
        void appendOneNode(ListNode*& tail, int val, int& carryBit) {
            carryBit = val / 10;
            val %= 10;
            tail->next = new ListNode(val);
            tail = tail->next;
        }
        virtual bool isDone() = 0;
        virtual int getVal() = 0;
        virtual void next() = 0;

       public:
        void append(ListNode*& tail, int& carryBit) {
            while (!isDone()) {
                int val = getVal() + carryBit;
                appendOneNode(tail, val, carryBit);
                next();
            }
        }
    };

    class AddListNodeOne : public AddListNodeAbs {
       private:
        ListNode*& node;
        virtual bool isDone() { return nullptr == node; }
        virtual int getVal() { return node->val; }
        virtual void next() { node = node->next; }

       public:
        AddListNodeOne(ListNode*& node) : node(node) {}
    };

    class AddListNodeTwo : public AddListNodeAbs {
       private:
        ListNode *&l1, *&l2;
        virtual bool isDone() { return nullptr == l1 || nullptr == l2; }
        virtual int getVal() { return l1->val + l2->val; }
        virtual void next() {
            l1 = l1->next;
            l2 = l2->next;
        }

       public:
        AddListNodeTwo(ListNode*& l1, ListNode*& l2) : l1(l1), l2(l2) {}
    };
	
	// 带点设计模式的解法
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode dummy;
        ListNode* tail = &dummy;
        int carryBit = 0;

        unique_ptr<AddListNodeAbs> abs;

        abs = make_unique<AddListNodeTwo>(l1, l2);
        abs->append(tail, carryBit);

        abs = make_unique<AddListNodeOne>(l1);
        abs->append(tail, carryBit);

        abs = make_unique<AddListNodeOne>(l2);
        abs->append(tail, carryBit);

        // 特殊处理最后的进位
        if (carryBit) {
            tail->next = new ListNode(carryBit);
            tail = tail->next;
        }
        return dummy.next;
    }

    void appendLeftNode(ListNode*& tail, ListNode* left, int& carryBit) {
        while (left) {
            int val = left->val + carryBit;

            carryBit = val / 10;
            val %= 10;
            tail->next = new ListNode(val);
            tail = tail->next;

            left = left->next;
        }
    }
	
	// 一般解法
    ListNode* addTwoNumbers2(ListNode* l1, ListNode* l2) {
        ListNode dummy;
        ListNode* tail = &dummy;
        int carryBit = 0;
        while (l1 && l2) {
            int val = l1->val + l2->val + carryBit;

            carryBit = val / 10;
            val %= 10;
            tail->next = new ListNode(val);
            tail = tail->next;

            l1 = l1->next;
            l2 = l2->next;
        }
        appendLeftNode(tail, l1, carryBit);
        appendLeftNode(tail, l2, carryBit);
        if (carryBit) {
            tail->next = new ListNode(carryBit);
            tail = tail->next;
        }
        return dummy.next;
    }
	
	ListNode* addTwoNumbers3(ListNode* l1, ListNode* l2) {
        ListNode head(-1);
        ListNode* tail = &head;
        int carry = 0;
        while(l1 != NULL || l2 != NULL) {
            int sum = 0;
            #ifdef DEBUG
            if (l1 != NULL) {
                sum += l1->val;
                l1 = l1->next;
            }
            if (l2 != NULL) {
                sum += l2->val;
                l2 = l2->next;
            }
            sum += carry;
            carry = 0;
            if (sum >= 10) {
                sum -= 10;
                carry = 1;
            }
            tail->next = new ListNode(sum);
            tail = tail->next;
            #endif // DEBUG

            int x = (l1 == NULL) ? 0 : l1->val;
            int y = (l2 == NULL) ? 0 : l2->val;
            sum = x + y + carry;
            carry = sum / 10;
            tail->next = new ListNode(sum%10);
            tail = tail->next;
            if (l1 != NULL) {
                l1 = l1->next;
            }
            if (l2 != NULL) {
                l2 = l2->next;
            }
        }
        if (carry == 1) {
            tail->next = new ListNode(1);
        }
        return head.next;
    }
};
// @lc code=end

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:37:25  更:2022-05-12 16:39:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:49:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码