首页 > 其他 > 详细

2. 两数相加

时间:2021-01-12 09:46:40      阅读:23      评论:0      收藏:0      [点我收藏+]

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;
    }
};

2. 两数相加

原文:https://www.cnblogs.com/wtyuan/p/14265081.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!