You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8

首先使用链表实现等长无进位的求和,即实现 (1 —> 2 -> 3) + (1 -> 2 -> 3)=(2 -> 3 -> 6)

 #include <iostream>

 using namespace std;

 struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
}; class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { int val1 = , val2 = ; ListNode *l = NULL;
ListNode *l_end = NULL;
ListNode *l_new = NULL; val1 = l1->val;
val2 = l2->val;
l1 = l1->next;
l2 = l2->next;
l_new = (ListNode *)new ListNode((val1 + val2) % );
l_new->next = NULL;
l = l_new;
l_end = l;
while (l1 != NULL || l2 != NULL){ val1 = l1->val;
val2 = l2->val;
l1 = l1->next;
l2 = l2->next; l_new = (ListNode *)new ListNode((val1 + val2)%);
l_new->next = NULL; l_end->next = l_new;
l_end = l_new;
} return l; }
}; int main()
{
ListNode *l1, *l2;
ListNode *l;
l1 = (ListNode *)new ListNode();
l2 = (ListNode *)new ListNode();
l1->next = (ListNode *)new ListNode();
l2->next = (ListNode *)new ListNode();
l1->next->next = (ListNode *)new ListNode();
l2->next->next = (ListNode *)new ListNode();
Solution s;
l = s.addTwoNumbers(l1, l2);
while (l != NULL){
cout << l->val << endl;
l = l->next;
}
while ();
}

运行结果:

然后实现不等长无进位的求和,即实现 (1 —> 2 -> 3) + (1)=(2 -> 2 -> 3)

 #include <iostream>

 using namespace std;

 struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
}; class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { int val1 = , val2 = ; ListNode *l = NULL;
ListNode *l_end = NULL;
ListNode *l_new = NULL; val1 = l1->val;
val2 = l2->val;
l1 = l1->next;
l2 = l2->next;
l_new = (ListNode *)new ListNode((val1 + val2) % );
l_new->next = NULL;
l = l_new;
l_end = l;
while (l1 != NULL || l2 != NULL){
if (l1 == NULL){
val2 = l2->val;
l2 = l2->next;
val1 = ;
}
else if (l2 == NULL){
val1 = l1->val;
l1 = l1->next;
val2 = ;
}
else{
val1 = l1->val;
val2 = l2->val;
l1 = l1->next;
l2 = l2->next;
} l_new = (ListNode *)new ListNode((val1 + val2)%);
l_new->next = NULL; l_end->next = l_new;
l_end = l_new;
} return l; }
}; int main()
{
ListNode *l1, *l2;
ListNode *l;
l1 = (ListNode *)new ListNode();
l2 = (ListNode *)new ListNode();
l1->next = (ListNode *)new ListNode();
//l2->next = (ListNode *)new ListNode(2);
l1->next->next = (ListNode *)new ListNode();
//l2->next->next = (ListNode *)new ListNode(3);
Solution s;
l = s.addTwoNumbers(l1, l2);
while (l != NULL){
cout << l->val << endl;
l = l->next;
}
while ();
}

运行结果:

最后实现不等长有进位的求和,即实现题目要求(注意最后一位有进位的情况)

 #include <iostream>

 using namespace std;

 struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
}; class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { int val1 = , val2 = , carry = ; ListNode *l = NULL;
ListNode *l_end = NULL;
ListNode *l_new = NULL; val1 = l1->val;
val2 = l2->val;
l1 = l1->next;
l2 = l2->next;
l_new = (ListNode *)new ListNode((val1 + val2 + carry) % );
l_new->next = NULL;
l = l_new;
carry = (val1 + val2 + carry) / ;
l_end = l;
while (l1 != NULL || l2 != NULL){
if (l1 == NULL){
val2 = l2->val;
l2 = l2->next;
val1 = ;
}
else if (l2 == NULL){
val1 = l1->val;
l1 = l1->next;
val2 = ;
}
else{
val1 = l1->val;
val2 = l2->val;
l1 = l1->next;
l2 = l2->next;
} l_new = (ListNode *)new ListNode((val1 + val2 + carry)%);
l_new->next = NULL;
carry = (val1 + val2 + carry) / ; l_end->next = l_new;
l_end = l_new;
}
if (carry != ){
l_new = (ListNode *)new ListNode(carry);
l_new->next = NULL;
l_end->next = l_new;
l_end = l_new;
}
return l; }
}; int main()
{
ListNode *l1, *l2;
ListNode *l;
l1 = (ListNode *)new ListNode();
l2 = (ListNode *)new ListNode();
l1->next = (ListNode *)new ListNode();
l2->next = (ListNode *)new ListNode();
l1->next->next = (ListNode *)new ListNode();
l2->next->next = (ListNode *)new ListNode();
Solution s;
l = s.addTwoNumbers(l1, l2);
while (l != NULL){
cout << l->val << endl;
l = l->next;
}
while ();
}

运行结果:

因为是一边学C++,一边刷leetcode,所以有什么问题,十分感谢您能指点。

leetcode刷题: 002 Add Two Numbers的更多相关文章

  1. LeetCode刷题系列——Add Two Numbers

    题目链接 这个题目很简单,归并而已,好久没练编程,居然忘了在使用自定义类型前,要进行初始化(new操作). class ListNode{ int val; ListNode next; ListNo ...

  2. LeetCode第二题:Add Two Numbers

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  3. 刷题2. Add Two Numbers

    一.题目要求 You are given two non-empty linked lists representing two non-negative integers. The digits a ...

  4. LeetCode刷题笔录Add Binary

    Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...

  5. C#LeetCode刷题-数学

    数学篇 # 题名 刷题 通过率 难度 2 两数相加   29.0% 中等 7 反转整数 C#LeetCode刷题之#7-反转整数(Reverse Integer) 28.6% 简单 8 字符串转整数 ...

  6. LeetCode刷题指南(字符串)

    作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...

  7. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  8. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...

  9. LeetCode刷题总结-数组篇(下)

    本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...

  10. LeetCode刷题总结-树篇(上)

          引子:刷题的过程可能是枯燥的,但程序员们的日常确不乏趣味.分享一则LeetCode上名为<打家劫舍 |||>题目的评论: 如有兴趣可以从此题为起点,去LeetCode开启刷题之 ...

随机推荐

  1. Linux内核分析——操作系统是如何工作的

    万子惠 + 原创作品转载请注明出处 + <Linux内核分析> 实验部分 使用实验楼的虚拟机打开shell 然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain. ...

  2. 用文件模拟CMOS保存数据

    Hi3520D 芯片的内置CMOS最多只有5个字节可以用,但是我需要保存的数据有很多. 其中一个解决办法是:可以把其他需要保存的数据放到一个配置文件中.每次写的时候写到配置文件,用的时候再从配置文件读 ...

  3. option对象概念

    一.基础理解: var e = document.getElementById("selectId");   e.options = new Option("文本&quo ...

  4. 转 TextBox的EnableViewState属性问题

    问题如下: ---------------------------------------------------------------------------------------------- ...

  5. 动态添加Marquee标签,并动态赋值与属性

    前台加载js $(function(){ var publishStr="<%=publishText%>" var marqueeStr=" <mar ...

  6. html随记

    姓名输入框:<input type="text" value="默认有值"/> 密码输入框:<input type="text&qu ...

  7. web安全之http协议

    http协议 全称是超文本传输协议,是web的核心传输机制,也是服务端和客户端之间交换url的首选协议. url url全称是统一资源定器(统一资源标识符) 顾名思义 每一条格式正确且规范,但url都 ...

  8. 加载json文件没显示图片

    IOS 9新特性要求App内访问的网络必须使用HTTPS协议. 但是现在公司的项目使用的是HTTP协议,使用私有加密方式保证数据安全.现在也不能马上改成HTTPS协议传输. 以下解决办法: 在info ...

  9. 【python】*与** 参数问题

    可变参数 在Python函数中,还可以定义可变参数.顾名思义,可变参数就是传入的参数个数是可变的,可以是1个.2个到任意个,还可以是0个. 我们以数学题为例子,给定一组数字a,b,c……,请计算a2 ...

  10. 文件hash数据库

    unit YxdDB; interface uses Windows, Classes, SysUtils, SyncObjs; type TYXDDBValue = packed record Si ...