昨天重感冒起不来()今天继续!
官方题解:
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;
}
};
解析:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
定义一个函数,参数为两个链表,返回一个链表。
ListNode *head = nullptr, *tail = nullptr;
定义链表头和尾指针,初始化为nullptr。
int carry = 0;
定义进位变量,初始化为0。
while (l1 || l2) {
当l1和l2都为空时,退出循环。
int n1 = l1 ? l1->val: 0;
int n2 = l2 ? l2->val: 0;
取出l1和l2当前节点的值,如果节点为空则默认为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;
}
如果l1和l2不为空,则将指针分别指向下一个节点。
if (carry > 0) {
tail->next = new ListNode(carry);
}
如果最高位有进位,则将进位添加到链表末尾。
return head;
返回链表头节点。
ps.其实感觉也没有完全掌握知识点,还是多刷题积累知识吧!