【LeetCode】Add Two Numbers(两数相加)
这道题是LeetCode里的第2道题。
题目要求:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
这道题的条件判断很简单,如下:
1.是否为尾节点
2.是否产生进位
3.是否等于9
4.是否需要拓展空间
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *p = l1, *q = l2;
int add, carry = 0;//carry标志进位
while (1) {
add = p->val + q->val + carry;
p->val = add % 10;
if (add > 9)carry = 1;
else carry = 0;
if (p->next == NULL || q->next == NULL)break;
p = p->next;
q = q->next;
}
//这里就相当于是一个链表只有一个节点,另一个链表加上这个一个节点的数值
if (p->next) {//list1
p = p->next;
q = p;
while (carry) {//是否需要进位
if (q->val == 9) {//是否等于9
if (q->next == NULL) {//是否是最后一个节点
q->val = 0;
q->next = (ListNode*)malloc(sizeof(ListNode));
q->next->val = 1;
q->next->next = NULL;
break;
}
q->val = 0;
q = q->next;}
else {q->val++;carry = 0;}
}
return l1;
}
if (q->next) {//list2
q = q->next;
l2 = q;
while (carry) {
if (q->val == 9) {
if (q->next == NULL) {
q->val = 0;
q->next = (ListNode*)malloc(sizeof(ListNode));
q->next->val = 1;
q->next->next = NULL;
break;
}
q->val = 0;
q = q->next;}
else {q->val++;carry = 0;}
}
p->next = l2;
return l1;
}
if (carry) {
q = (ListNode*)malloc(sizeof(ListNode));
q->next = NULL;
q->val = 1;
p->next = q;
}
return l1;
}
};
运行结果:

个人总结:
在设计算法初期,造成了许多代码的累赘,以上代码是经过优化后得到的。但是在这里两个if条件中还是会有代码的重复,但能够做出来我就已经很开心了。(^-^)V
【LeetCode】Add Two Numbers(两数相加)的更多相关文章
- LeetCode(2):Add Two Numbers 两数相加
Medium! 题目描述: 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头 ...
- [CareerCup] 18.1 Add Two Numbers 两数相加
18.1 Write a function that adds two numbers. You should not use + or any arithmetic operators. 这道题让我 ...
- Leetcode2.Add Two Numbers两数相加
给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...
- [LeetCode]2.Add Two Numbers 两数相加(Java)
原题地址: add-two-numbers 题目描述: 给你两个非空的链表,表示两个非负的整数.它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字. 请你将两个数相加,并以相同形式返回 ...
- 【LeetCode】2. Add Two Numbers 两数相加
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- [leetcode]2. Add Two Numbers两数相加
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- LeetCode 2. Add Two Numbers (两数相加)
题目标签:Linked List, Math 题目给了我们两个 Linked List, 各代表一个数字,不过顺序的反的.让我们把两个数字相加. 和普通的相加其实差不多,只不过变成了 Linked L ...
- [Leetcode] Add two numbers 两数之和
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...
- LeetCode Add Two Numbers 两个数相加
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
随机推荐
- python第一模块数据类型
一·进制之间的转换 十进制转换为二进制:逆序取余法. 二进制转换为十进制:如1101 1*2^0 + 0*2^1 + 1*2^2 +1 十六进制转换为二进制:231 0010 0011 ...
- substring()和substr()的使用以及区别
在JavaScript中,通常会用到截取,那所谓截取呢,其实就是要获得被截取元素的某个位置到某个位置的内容,那么JS给我提供了substring和substr这两种方法: 这两种截取的方式有什么区别呢 ...
- openssl 安装配置
Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用.首先下载Openssl包: ...
- Android View 背景选择器编写技巧
在项目中选择器的使用是非常多的,以下是本人在项目中的一些常用的背景选择器的写法 带边框下划线背景选择器效果图: 上面布局中放了10个CheckBox,然后设置了CheckBox的背景图片位,背景选择器 ...
- How to install Eclipse in linux
http://askubuntu.com/questions/26632/how-to-install-eclipse
- HDinsight 系列-使用证书登陆中国区Azure
使用azure explorer 插件的时候,登陆默认是globle的azure网站,中国区的azure不能直接使用 可以使用auth文件认证 auth 文件生成 az cloud show -o j ...
- vertx从入门到精通
1.Vert.x安装指南 http://blog.csdn.net/sdyy321/article/details/38926005 http://blog.csdn.net/chszs/articl ...
- 4个Linux服务器监控工具
下面是我想呈现给你的4个强大的监控工具. htop – 交互式进程查看器 你可能知道在机器上查看实时进程的标准工具top.如果不知道,请运行$ top看看,运行$ man top阅读帮助手册. hto ...
- GNU make(2)
GNU make(2) 参考: GNU Make学习总结(二) 变量 变量由一个前导符号$加上字符或者是括号字符组成, 名称区分大小写. 命名: 习惯上用全部大写字符表示常量, 小写字符表示变量, 单 ...
- UVA 1220 Party at Hali-Bula (树形DP)
求一棵数的最大独立集结点个数并判断方案是否唯一. dp[i][j]表示以i为根的子树的最大独立集,j的取值为选和不选. 决策: 当选择i时,就不能选择它的子结点. 当不选i时,它的子结点可选可不选. ...