1. 题目
2. 解法
2.1 解法一(直接模拟)
- 时间复杂度
- 空间复杂度(返回值不计入时间复杂度)
- 代码
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* head = nullptr; // 头指针
ListNode* tail = nullptr; // 尾指针(负责加法移动)
int carry = 0;
while (l1 || l2){ // 加法放到整个循环当中进行
int n1 = l1? l1->val : 0; // 三目运算符:先判断列表是否为空,然后根据情况进行赋值
int n2 = l2? l2->val : 0;
int sum = n1 + n2 + carry; // 先计算好求和结果
if (!head){ // 结果链表为空链表
head = tail = new ListNode(sum % 10);
}
else{
tail->next = new ListNode(sum % 10); // 创建新结点
tail = tail->next;
}
carry = sum / 10; // 进位计算
if (l1){ // 指针后移
l1 = l1->next;
}
if (l2){ // 指针后移
l2 = l2->next;
}
}
if (carry > 0){
tail->next = new ListNode(carry); // 为最后的进位创建一个新的结点
}
return head; // 返回结果链表
}
};
2.2 解法二(直接模拟——紧凑的代码结构)
- 时间复杂度
- 空间复杂度(返回值不计入时间复杂度)
- 代码
class Solution{
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2){
ListNode* head = new ListNode(-1);
ListNode* cur = head;
int carry = 0;
while(l1 || l2 || carry){
int n1 = l1? l1->val : 0;
int n2 = l2? l2->val : 0;
ListNode* node = new ListNode((n1 + n2 + carry) % 10); // 结果直接创点计算
cur->next = node;
cur = cur->next;
l1 = l1? l1->next : nullptr; // 判空赋值
l2 = l2? l2->next : nullptr;
carry = (n1 + n2 + carry) / 10; // 计算进位
}
return head->next;
}
};