通过遍历链表 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)