[LeetCode] Add Two Numbers题解
You are given two non-empty linked lists representing two non-negative integers. 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.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
这是LeetCode中标记为Medium的一道题。其实这道题的思路非常简单,两个链表中每个对应节点的值相加作为第三个链表对应节点的值,考虑进位即可。但是因为太久没有做链表的题,做题的时候遇到了一些陷阱,并且最后Accepted的代码有四十行。看到Discussion中有人只用了十几行就解决了问题,非常钦佩(同时非常赧然)。
以下是两份代码的对比:
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode re(0), *p = &re;
int carry = 0;
while(l1 || l2 || carry){
int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) +carry;
carry = sum / 10;
p->next = new ListNode(sum % 10);
p = p->next;
l1 ? l1 = l1->next : l1;
l2 ? l2 = l2->next : l2;
}
return re.next;
}
};
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int a = 0,b = 0,carry = 0;//ab是用来记录两个链表的长度的,carry是进位
int ta = 0,tb = 0,tc = 0;//ta、tb是两个链表里头的一个数,tc是他们之和
ListNode* temp1 = l1;
ListNode* temp2 = l2;
ListNode* p = new ListNode(0);
ListNode* re= p;
while(temp1 != NULL){
a ++;
temp1 = temp1->next;
}
while(temp2 != NULL){
b ++;
temp2 = temp2->next;
}
int max = a > b? a : b;
for(int i = 0; i < max; i++){
ta = tc = tb = 0;
if(l1 != NULL){
ta = l1->val;
l1 = l1->next;
}
if(l2 != NULL){
tb = l2->val;
l2 = l2->next;
}
tc = (carry + ta + tb) % 10;
carry = (carry + ta + tb) / 10;//进位
p->next = new ListNode(tc);
p = p->next;
}
//可能最后有进位,所以再执行一次
if(ta+tb+carry>9){
p->next = new ListNode(1);
p = p->next;
}
return re->next;
}
};
做题中犯的错误
最初的指针用的是这种写法
ListNode *p;
ListNode *re= p;
...
p = new ListNode(tc);
p = p->next;
...
return re;
最后发现每次返回的re都是NULL。其实是因为自己犯了很傻的错误,虽然初始化时将指针p赋值给指针re,看起来好像re和p相等了,但是指针p执行了一次new ListNode之后指向了别的地址,所以指针re和p是不等的,这时候返回re当然就是空值了。
而后来的写法,由于p和re初始化指向一个node实例,并且执行new操作的是p->next,所以不会出现这种问题。
引以为鉴啊!
[LeetCode] Add Two Numbers题解的更多相关文章
- LeetCode Add Two Numbers II
原题链接在这里:https://leetcode.com/problems/add-two-numbers-ii/ 题目: You are given two linked lists represe ...
- [LeetCode] Add Two Numbers II 两个数字相加之二
You are given two linked lists representing two non-negative numbers. The most significant digit com ...
- [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 解题报告
Add Two NumbersYou are given two linked lists representing two non-negative numbers. The digits are ...
- Leetcode:Add Two Numbers分析和实现
Add Two Numbers这个问题的意思是,提供两条链表,每条链表表示一个十进制整数,其每一位对应链表的一个结点.比如345表示为链表5->4->3.而我们需要做的就是将两条链表代表的 ...
- [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
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...
- LeetCode——Add Two Numbers
Question:You are given two linked lists representing two non-negative numbers. The digits are stored ...
- [LeetCode] Add Two Numbers 链表
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...
随机推荐
- [Flex] 组件Tree系列 —— 运用variableRowHeight和wordWrap设置可变行高
mxml: <?xml version="1.0" encoding="utf-8"?> <!--功能描述:运用variableRowHeig ...
- Linux(Ubuntu)配置问题集
Cannot set LC_CTYPE to default locale: No such file or directory 安装Ubuntu Server版本(不带桌面环境)时,如果安装时的语言 ...
- dbus-launch(转)
*NAME* dbus-launch - Utility to start a message bus from a shell script dbus-launch - 从shell脚本启动一个消息 ...
- python 类中的某个函数作为装饰器
在python的类中,制作一个装饰器的函数, class A: def wrapper(func): ###装饰器 def wrapped(self,*arg,**kwargs) ... return ...
- (C/C++) STL 標頭檔 algorithm (一)
因為解題需求認識了一些STL相關funciton. 分別是 max_element (ForwardIterator first, ForwardIterator last); min_element ...
- GoLand 调试 Go
Goland 调试 Go 从百度得知 VS Code 不能很好的支持 Go 的调试真让人肝儿疼 -- 引言 准备 Win 10 Pro Go(Version 1.10) GoLand(2018.3) ...
- webstorm缩进配置
https://blog.csdn.net/m0_37604745/article/details/80076770 设置代码缩进1. 依次打开files —- settings —- Editor ...
- IC79620: USER'S ROUTINE MAY BE TERMINATED ABNORMALLY IF SOME SYSTEMROUTINES WERE RUN IN DB2FMP BEFORE
http://www-01.ibm.com/support/docview.wss?uid=swg1IC79620 APAR status Closed as program error. Error ...
- (转)CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup
CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup 原文:http://qizhanming.com/blog/2017/05/10/install-percona- ...
- hibernate一对多多对一双向
注意事项:一对多,多对一双向关联,在一的一方的多的getSet集合上的oneToMany上加上mappedBy.告诉hibernate由多的方一来维护关系.这也符合逻辑 ,本来外键就是在加在多的一方. ...