题目链接 2.两数相加
ps:在上次的组队学习中做了这个题目,这次就当是回顾一下指针的基础用法吧,因未系统学过指针的用法,就当是再学习学习。更新了部分注释以及解题思路。
题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题思路
(于2021.1.10添加)
本题算是一个很简单题目,主要是掌握指针的基础用法。两数相加跟数组模拟的高精度加法差不多,需要注意的是要进位。
程序代码
c++
(注释于2021.1.10添加)
class Solution{
public:
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2){
int digit = 0;
int carryDigit = 0;
ListNode *res = new ListNode(0);%指针的建立
ListNode *tmpRes = res;%再建立一个指针,用于后面的操作
while (l1 || l2 || carryDigit) {
int tmpSum = 0;
if (l1) {tmpSum += l1->val;l1 = l1->next;}
if (l2) {tmpSum += l2->val;l2 = l2->next;}
%如果此时l1和l2所指位置非空,就继续做加法
tmpSum += carryDigit;%处理进位情况
digit = tmpSum % 10;
carryDigit = tmpSum / 10;
//自己的收获就是下面这几行代码吧。
ListNode *newLocation = new ListNode(digit);
tmpRes->next = newLocation;
%将得到的结果加入到tmpres指针中来,并将下一个位置指向newlocation
tmpRes = tmpRes->next;
}
tmpRes = res->next;
%因一开始res指针指的是最开始的位置,一直没有改变,
%所以在这里把tmpres的指针位置指向res->next,方便输出
return tmpRes;
}
};
python
ps:(于2021.1.10添加)因最近这段时间还有其他事情要弄,就不再自己写Python版本,下面是datawhale给出的Python参考代码。
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
result = ListNode(-1)
l3 = result
flag = 0
while l1 is not None and l2 is not None:
a = l1.val
b = l2.val
c = a + b + flag
l3.next = ListNode(c % 10)
flag = 1 if c >= 10 else 0
l1 = l1.next
l2 = l2.next
l3 = l3.next
while l1 is not None:
a = l1.val + flag
l3.next = ListNode(a % 10)
flag = 1 if a >= 10 else 0
l1 = l1.next
l3 = l3.next
while l2 is not None:
b = l2.val + flag
l3.next = ListNode(b % 10)
flag = 1 if b >= 10 else 0
l2 = l2.next
l3 = l3.next
if flag == 1:
l3.next = ListNode(flag)
return result.next
心得
这题不难,主要是学会了如何在链表中进行赋值操作。顺便转发一下这个博客,之前参考了这个博客。单链表的创建、赋值 C++示例