普通版本(未使用哨兵位)
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *head = nullptr, *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;
}
};
- 缺点:每次循环都要判断头结点是否为空 + if判断语句过多 = 代码臃肿
优化版本(使用哨兵位)
/**
* 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* source = new ListNode;
ListNode* head = source;
int add = 0;
while(l1||l2||add)
{
int n = (l1?l1->val:0) + (l2?l2->val:0) + add;//每次计算 = 参与计算的两个数 + 进位
add = n/10;//获取新的进位
n %= 10;//获取要存放在新结点的值
head->next = new ListNode(n);//每次插入时提前新建结点
head = head->next;
// l1 = l1->next;//如果当前l1或l2为空那么这样做就会报错
// l2 = l2->next;
l1 == 0 ? 0 : l1 = l1->next;
l2 == 0 ? 0 : l2 = l2->next;
//(l1 ? l1 = l1->next : 0), l2 ? l2 = l2->next : 0;//也可以这样写
}
if(add) head->next = new ListNode(1);
return source->next;
}
};
- 逗号表达式允许多个表达式出现在同一条语句中,每个表达式用逗号分割,逗号表达式的值是最后一个表达式的值,所有表达式都会被执行
int a = 5, b = 10, c = 15;
int result = (a++, b++, c++);
//result == 15、a == 6、b == 11、c == 16
~over~