一、考察知识点
1、链表的创建与遍历。
2、高精度加法的模拟。(高精度加法通常无法使用int或者double表示,选择使用链表或者字符串表示)
二、注意点
1、两个数字长度不同,个位数需要对齐。
2、答案的长度比加数长。
3、循环的终止条件。
三、代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode dummy(0);
ListNode* tail=&dummy;
int sum=0;
while(l1||l2||sum){
sum += (l1?l1->val:0) + (l2?l2->val:0);
l1 = l1?l1->next : nullptr;
l2 = l2?l2->next : nullptr;
tail->next = new ListNode(sum%10);
sum/=10;
tail = tail->next;
}
return dummy.next;
}
};
代码细节:
1、在栈上定义出DummyHead,自动管理内存。
2、tail指针指向位于栈上的对象。
3、tail->next之后的元素全部是在堆上创建出来。体现了链表地址的灵活性,在同个链表的单元内存既可以分布在堆上也可以分布在栈上。
4、直接使用dummy.next而不是指针,因为dummy实在栈上创建的对象。tail保存链表表尾地址,动态变量。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
dummy = tail = ListNode(0)
sum = 0
while l1 or l2 or sum:
sum += (l1.val if l1 else 0) + (l2.val if l2 else 0)
tail.next = ListNode(sum % 10)
tail = tail.next
sum //= 10
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
return dummy.next