【转载请注明】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)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.

题目意思其实就是将两个数,以链表逆序的方式进行存储

求和后,将结果也逆序输出

思路:

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 链表求和的更多相关文章

  1. LeetCode-2. Add Two Numbers(链表实现数字相加)

    1.题目描述 You are given two non-empty linked lists representing two non-negative integers. The digits a ...

  2. [LeetCode] Add Two Numbers 链表

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...

  3. 【LeetCode】2.Add Two Numbers 链表数相加

    题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...

  4. 002 Add Two Numbers 链表上的两数相加

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

  5. Add Two Numbers(链表)

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...

  6. leetcode 2 Add Two Numbers(链表)

    数字反过来这个没有什么麻烦,就是镜像的去算十进制加法就可以了,然后就是简单的链表. /** * Definition for singly-linked list. * struct ListNode ...

  7. [LeetCode]2. Add Two Numbers链表相加

    注意进位的处理和节点为null的处理 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { int flag = 0; ListNode ...

  8. 链表求和12 · Add Two Numbers

    反向存储,从左往右加 [抄题]: 你有两个用链表代表的整数,其中每个节点包含一个数字.数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头.写出一个函数将两个整数相加,用链表形式返回和.给 ...

  9. LeetCode 445. Add Two Numbers II(链表求和)

    题意:两个非空链表求和,这两个链表所表示的数字没有前导零,要求不能修改原链表,如反转链表. 分析:用stack分别存两个链表的数字,然后从低位开始边求和边重新构造链表. Input: (7 -> ...

随机推荐

  1. PHP基础库及扩展库安装

    一.安装PHP所需的lib库(基础库): 1.yum install zlib-devel libxml2-devel libjpey-devel libjpeg-turbo-devel libico ...

  2. TCP/IP UDP 协议首部及数据进入协议栈封装的过程

    数据的封装 UDP 封装 TCP 封装 IP 封装 检验和算法 当应用程序用TCP传送数据时,数据被传送入协议栈中,然后逐一通过每一层直到被当作一串比特流送入网络 注: UDP数据TCP数据基本一致. ...

  3. Eleastisearch6.0.0 read_only_allow_delete: false

    Eleastisearch6.0.0由单节点升级到多节点集群cluster时候出现的分片同步错误问题解决 原创 2018年01月18日 16:33:21 5 启动多个节点的ES后,ES开始推举mast ...

  4. poj 1698

    题意:爱丽丝喜欢拍电影,现在正好有N个公司找她拍电影,每部电影都指定在每周的星期几拍,要用D天拍完电影,最迟M个星期要拍完.问爱丽丝能不能拍完所有电影. 分析:350天各为一个顶点,每个顶点都有且只有 ...

  5. [bzoj4003][JLOI2015]城池攻占_左偏树

    城池攻占 bzoj-4003 JLOI-2015 题目大意:一颗n个节点的有根数,m个有初始战斗力的骑士都站在节点上.每一个节点有一个standard,如果这个骑士的战斗力超过了这个门槛,他就会根据城 ...

  6. JQuery获取select选中值和清除选中状态(转)

    1.获取值 var provinceSearch = $("#loc_province_search").find("option:selected").att ...

  7. solaris11-text-安装GUI(gnome)

      http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=45057&id=3018467 1.下载所需的资源Text Ins ...

  8. Windows移动开发(五)——初始XAML

    关于详细的基本功就先说这么多.后面遇到再补充说明,前面说的都是一些代码和原理方面的东西.接下来说的会有界面和代码结合,会有成就感,由于能真正的做出东西来了. Windows移动开发包含Windows ...

  9. 安装 KB2844286 导致SharePoint 2010 XSLT web part 显示出现错误

    上周末给Windows 打完补丁后,周一在通过From SharePoint的方式插入图片时,出现了如下错误: Unable to display this Web Part. To troubles ...

  10. axis实现webservices分布式通信

    分布式通信原理 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2ZsMjAxMjEzMTQ=/font/5a6L5L2T/fontsize/400/fil ...