zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    解决servlet在web.xml中的路径跳转问题
    浅谈上市公司期权
    spring 与mybatis 整合总结
    学习ssm心得
    django中ORM的事务操作
    Celery快速入门
    vagrant 使用指南
    数据库之mysql
    python之pip
    linux基础
  • 原文地址:https://www.cnblogs.com/wtyuan/p/14265081.html
Copyright © 2011-2022 走看看