LeetCode题解——Add Two Numbers

链表求和算法
本文介绍了一种链表求和的算法实现,该算法适用于数字由链表逆序表示的情况。通过对两个链表的每个结点进行求和,并处理可能产生的进位,最终形成新的链表来表示求和结果。

题目

两个数字求和,数字用链表表示,每一个结点代表一位。链表顺序与数字顺序相反,即表头存放数字的最低位。

 

解法

分别遍历两个链表的每个结点,对两个结点求和即可。要维护一个变量保存每次相加之后的进位。

更常见的,链表顺序与数字顺序相同,那么做一次链表逆序,求和之后再逆序回来即可。

 

代码

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
12         ListNode retHead(-1), *pr = &retHead, *p1 = NULL, *p2 = NULL;
13         int carry = 0;  //保存每次结点求和之后的进位,用一个bool也可以
14         
15         for(p1 = l1, p2 = l2; p1 != NULL && p2 != NULL; p1 = p1->next, p2 = p2->next)   //p1 p2分别遍历两个链表
16         {
17             int sum  = p1->val + p2->val + carry;
18             pr->next = new ListNode(sum % 10);  //求和结果保存在新结点
19             
20             pr    = pr->next;    //p2指向求和链表的尾结点
21             carry = sum / 10;
22         }
23         
24         for(ListNode *p = (p1 == NULL ? p2 : p1); p != NULL; p = p->next)   //处理两个链表中未处理完的链表剩余节点
25         {
26             int sum  = p->val + carry;
27             pr->next = new ListNode(sum % 10);
28             
29             pr    = pr->next;
30             carry = sum / 10;
31         }
32         
33         if(carry != 0)  //如果最后还有进位,必定是1
34         {
35             pr->next = new ListNode(carry);
36         }
37         
38         return retHead.next;
39     }
40 };

 

转载于:https://www.cnblogs.com/qieerbushejinshikelou/p/3989919.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值