一道较为简单的链表题,需要对链表的创建较为熟悉。
唯一需要注意的是需要处理加和后的进位值,需要考虑以下三个方面:
时间复杂度:\(O(m+n)\),\(m\)和\(n\)分别为两个链表的长度。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head, * tail;
head = tail = nullptr; // 初始化头、尾指针
int sum = 0, carry = 0; // carry表示进位,初始值为0
while (l1 != nullptr && l2 != nullptr) {
ListNode* p = new ListNode();
sum = l1->val + l2->val + carry; // 加和时需要加前一位的进位值
carry = 0;
if (sum >= 10) { //1. 链表1和链表2对应位进行加和时需要处理进位值。
carry = 1;
sum -= 10;
}
p->val = sum;
if (head == nullptr) head = tail = p; // 往链表添加第一个节点
else {
tail->next = p; // 添加非第一个节点
tail = p;
}
l1 = l1->next;
l2 = l2->next;
}
// 处理两个链表长度不同的情况
while (l1 != nullptr) {
if (carry) { // 2. 处理两个链表中较长的链表时,当前位的值与前一位的进位值加和时需要处理进位值
l1->val += carry;
carry = 0;
if (l1->val >= 10) {
l1->val = l1->val - 10;
carry = 1;
}
}
tail->next = l1;
tail = l1;
l1 = l1->next;
}
while (l2 != nullptr) {
if (carry) {
l2->val += carry;
carry = 0;
if (l2->val >= 10) {
l2->val = l2->val - 10;
carry = 1;
}
}
tail->next = l2;
tail = l2;
l2 = l2->next;
}
// 3. 两个链表的节点全部遍历完后,若最终进位不为零,需单独为该进位值往输出链表中添加一个新的节点
if (carry) {
ListNode* p = new ListNode(carry);
tail->next = p;
tail = p;
}
return head;
}
};
原文:https://www.cnblogs.com/wtyuan/p/14265081.html