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 };