Leetcode0002--Add Two Numbers 链表求和
【转载请注明】http://www.cnblogs.com/igoslly/p/8672467.html
来看一下题目:
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. Example Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) |
题目意思其实就是将两个数,以链表逆序的方式进行存储 求和后,将结果也逆序输出 |
思路:
1、由于两个数的大小位数,链表 -> int数进行的想法基本无望,可能越界
2、链表已经逆序,已经提供很好的“对应位相加,向前进位”的运算模式
注意点:
1、List1和List2不等长
2、当某个List完成后,可单个计算另外的List
3、考虑进位关系,例如9+99999
4、最后进位时,需额外设定val=1的结点
实现方法1(初始):
方法1即是依照上面思路,依样画葫芦得到的结果
但其实细看,本题代码重复的部分太多,而且一直需要使用pre变量跟踪前结点,有些多余
/**
* 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 *p1=l1,*p2=l2,*pre=p1;
int up=; // 将结点l1作为结果链表返回,在l1和l2均在有效范围内,进行添加,同时更新up进位
while(p1&&p2){
p1->val+=p2->val+up;
up=p1->val/;
if(up==){
p1->val-=;
}
pre=p1;
p1=p1->next;
p2=p2->next;
} // 当l1结束后,pre最后个元素连接到l2后部
if(p1==NULL){
pre->next=p2;
while(p2!=NULL){
p2->val+=up;
up=p2->val/;
if(up==){
p2->val-=;
}
pre=p2;
p2=p2->next;
}
} // 当l2结束后,单独计算l1
if(p2==NULL){
while(p1!=NULL){
p1->val+=up;
up=p1->val/;
if(up==){
p1->val-=;
}
pre=p1;
p1=p1->next;
}
} // 当计算结束,up=1时,表示和多一位,新创建val=1的ListNode添加
if(up==){
pre->next=new ListNode();
}
return l1;
}
};
实现方法2 (对方法1进行优化):
相对看起来更加简洁
/**
* 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) {
int carry=;
ListNode* listNode=new ListNode();
ListNode* p1=l1,*p2=l2,*p3=listNode; // 修改判断条件从 && 到 ||
while(p1!=NULL||p2!=NULL)
{
// 在while循环里添加p1和p2的判断,省去了某个List完毕后单独List的情况
if(p1!=NULL)
{
carry+=p1->val;
p1=p1->next;
}
if(p2!=NULL)
{
carry+=p2->val;
p2=p2->next;
}
p3->next=new ListNode(carry%);
p3=p3->next;
carry/=;
} // 由于辟出了单独的result链表,故而无需再用pre继续前结点
if(carry==)
p3->next=new ListNode();
return listNode->next;
}
};
Leetcode0002--Add Two Numbers 链表求和的更多相关文章
- LeetCode-2. Add Two Numbers(链表实现数字相加)
1.题目描述 You are given two non-empty linked lists representing two non-negative integers. The digits a ...
- [LeetCode] Add Two Numbers 链表
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...
- 【LeetCode】2.Add Two Numbers 链表数相加
题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...
- 002 Add Two Numbers 链表上的两数相加
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- Add Two Numbers(链表)
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...
- leetcode 2 Add Two Numbers(链表)
数字反过来这个没有什么麻烦,就是镜像的去算十进制加法就可以了,然后就是简单的链表. /** * Definition for singly-linked list. * struct ListNode ...
- [LeetCode]2. Add Two Numbers链表相加
注意进位的处理和节点为null的处理 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { int flag = 0; ListNode ...
- 链表求和12 · Add Two Numbers
反向存储,从左往右加 [抄题]: 你有两个用链表代表的整数,其中每个节点包含一个数字.数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头.写出一个函数将两个整数相加,用链表形式返回和.给 ...
- LeetCode 445. Add Two Numbers II(链表求和)
题意:两个非空链表求和,这两个链表所表示的数字没有前导零,要求不能修改原链表,如反转链表. 分析:用stack分别存两个链表的数字,然后从低位开始边求和边重新构造链表. Input: (7 -> ...
随机推荐
- OI数学知识清单
OI常用的数学知识总结 本文持续更新…… 总结一下OI中的玄学知识 先列个单子,(from秦神 数论 模意义下的基本运算和欧拉定理 筛素数和判定素数欧几里得算法及其扩展[finish] 数论函数和莫比 ...
- 关于 BaseHTTPServer 的介绍
简介: (1) 基础的web服务器是一个模板,其其角色是客户端和服务器端完成必要的HTTP交互,在basehttpserver模块中可以找到一个名字叫HTTPServer 的服务器基本类 (2)处理程 ...
- -------------Django-----URLS路由
一.相约Django. 1.Django的特点:Django定义了服务分布.路由映射.模板编程.数据处理的一套完整的功能. (1)集成数据访问组件:Django的model层自带数据库ORM组件. ( ...
- 小白两篇博客熟练操作MySQL 之 第二篇
小白两篇博客熟练操作MySQL 之 第二篇 一. 视图 视图是一个虚拟表,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集, 并可以将其当做表来使用. s ...
- 【codeforces 510B】Fox And Two Dots
[题目链接]:http://codeforces.com/contest/510/problem/B [题意] 让你在一个二维的方格里面找环; 两个点有相邻的边它们才是相连的; 有环YES,没环NO ...
- 51nod挑的部分5级题
最近心情不好所以写代码来获得快落 4级题有点难做?然后就开始挑简单的5级题开始写 然后准备记录一些自己没有做出来 参考讨论区或者博客才做出来的题目 51nod_1189 阶乘分数 这个题参考了讨论区 ...
- 混合了RBAC和ACL的权限系统(一) -- 用户组织结构
最近的工作是一个基础设计,打造一个基于RBAC和ACL的权限基础组件. 这个基础组件的特点是:同时混合了RBAC和ACL的认证方式,也就是说同时提供系统级别的授权(RBAC)和对象级别的授权(ACL) ...
- [bzoj3192][JLOI2013]删除物品_树状数组_栈
删除物品 bzoj-3192 JLOI-2013 题目大意:给你n个物品,分成2堆.所有的物品有不同的优先级.我只可以将一堆中的堆顶移动到另一个堆的堆顶.而如果当前物品是全局所有物品中优先级最高的,我 ...
- springMVC入门笔记
目录 一.回顾Servlet 二.SpringMVC简介 三.搭建SpringMVC第一个案例 四.简单流程及配置 五.使用注解开发Controller 六.参数绑定 基本数据类型的获取: 如果表单域 ...
- HDU 3666
此题不难,不等式很空易就列出来了,只是要把它转化成减法形式..卡在这了... 其实取一个log对数就好了...要记住这个技巧.用基于dfs的spfa.. #include<iostream> ...