C++每日一练1-两数相加

    科技2024-01-07  100

    两数相加

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

    如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

    您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers

    结构体定义:

    struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} };

    整体思路: 1.两链从低位开始对齐相加,产生进位则CF标志置为1 2.处理进位 3.在较短的链表的对齐节点补零

    代码:

    class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* p1 = l1;//l1移动指针 ListNode* p2 = l2;//l2移动指针 ListNode* head = new ListNode(0);//生成链 ListNode* ret = head; int CF = 0;//进位标志 while (p1 || p2) { //短链缺处用0替补 if (!p1) p1 = new ListNode(0); if (!p2) p2 = new ListNode(0); int n = ((p1->val + p2->val) + CF); CF = 0;//复位进位标志位 //处理加上进位后溢出 if (n >= 10) { n = n % 10; CF = 1; } //判断本次相加是否需要进位 if ((p1->val + p2->val) >= 10) { CF = 1; } ListNode* node = new ListNode(n); head->next = node; head = head->next; p1 = p1->next; p2 = p2->next; } //判断遍历链表结束时是否存在进位,即999+1会存在第四位的进位 if (CF == 1) { ListNode* node = new ListNode(CF); head->next = node; head = head->next; } return ret->next; } };

    复杂度分析

    时间复杂度:O(max(m,n))。 空间复杂度:O(max(m,n))。

    Processed: 0.010, SQL: 8