2. 两数相加

题目链接

解析

一道较为简单的链表题,需要对链表的创建较为熟悉。

唯一需要注意的是需要处理加和后的进位值,需要考虑以下三个方面:

  1. 链表1和链表2对应位进行加和时需要处理进位值
  2. 处理两个链表中较长的链表时,当前位的值与前一位的进位值加和时需要处理进位值
  3. 两个链表的节点全部遍历完后,若最终进位不为零,需单独为该进位值往输出链表中添加一个新的节点

复杂度

时间复杂度:\(O(m+n)\)\(m\)\(n\)分别为两个链表的长度。

实现

C++

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;
    }
};
posted @ 2021-01-12 00:13  wtyuan  阅读(65)  评论(0编辑  收藏  举报