leetcode小白刷题之旅----2.Add Tow Numbers

仅供自己学习

题目:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

 

思路:

这道题把题目弄清楚思路就会比较清晰了。思路比较直接,两个链表的每个元素直接相加,记录是否有进位,得到的结果直接new一个新结点加在新链表的后面即可。但存在一些细节需要处理。

1.考虑到两个链表不等长。将短的那部分的数默认为0继续执行相加操作,用三目运算即可

2.进位的处理。因为进位只有0和1,则用sum/10即可。我们的sum不记录总的和,而是每个位数据之和。

3.创建新结点传入的参数。因为我们结点记录的只是一个数,不需要进位,则传入参数sum%10,即可只取个位的数

4.因为要求返回一个链表,故需要创建一个指针作为不动的头结点,这样也可以直接把新结点直接接入头结点,传出的时候传head->next即可。同时再多创建一个动指针进行新结点的添加行为。

 

代码

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode() : val(0), next(nullptr) {}
 7  *     ListNode(int x) : val(x), next(nullptr) {}
 8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 9  * };
10  */
11 class Solution {
12 public:
13     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
14         ListNode* stophead = new ListNode(-1);  //不动的头结点
15         ListNode* mpt = stophead;  //为新结点指向的指针
16         int carry=0;
17         while(l1||l2) //不等长链表的情况也能继续执行
18         {
19             int val1 = l1 ? l1->val:0;
20             int val2 = l2 ? l2->val:0;  //19-20都是在让短的链表缺少的位都为0
21             int sum = val1+val2+carry;
22             carry = sum / 10;
23             mpt->next = new ListNode(sum%10);  //创建新节点,val为sum%10,next指针为NULL的新结点 接到mpt指向的后面
24             mpt=mpt->next;
25             if(l1) l1=l1->next;  //如果链表不为空就继续
26             if(l2) l2=l2->next;
27         }
28         if(carry) mpt->next = new ListNode(carry); //处理最高位有进位的情况
29         return stophead->next;
30     }
31 };

 

posted @ 2021-01-23 11:40  Mrsdwang  阅读(59)  评论(0编辑  收藏  举报