通过遍历链表 l1
和 l2
,逐位相加对应节点的值,同时加上前一位的进位 carry
。如果某个链表已经遍历完,则用 0 填充其值。对于每次相加的结果,取个位作为新节点的值,进位部分保存在 carry
中。如果链表尚未初始化,创建头节点;否则在尾部添加新节点。遍历结束后,如果 carry
不为 0,则需额外创建一个节点存储最后的进位值,最终返回表示相加结果的链表头节点。
/**
* 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 *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{
//在尾指针后继位置创造新节点,节点的值是两数之和与10的余数
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;
}
};
- 时间复杂度:O(max(m,n))
- 空间复杂度:O(1)