Leetcode C++《热题 Hot 100-22》2.两数相加

Leetcode C++《热题 Hot 100-22》2.两数相加

热题Hot 100的easy题目已经结束,开始medium题目,加油呀

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

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

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

示例:

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. 思路
  • 没办法先把l1和l2转换成数字,因为转换成数字你用int、long long存储都是不够的
  • 方案1:逻辑简单,可以用vector存储了l1和l2里面的val值,操作起来方便很多,最后将vector结果构成链表返回
    • 方案1:时间复杂度n,空间复杂度n
  • 方案2:不借助外部的数据结构,仅使用链表,直接相加,这两个链表谁比较长,修改谁
    • 方案2:时间复杂度n,空间复杂度1
  1. 代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int l1_length = 0;
        int l2_length = 0;
        ListNode* l1_head = l1;
        ListNode* l2_head = l2;
        while (l1 != NULL) {
            l1_length++;
            l1 = l1->next;
        }
        while (l2 != NULL) {
            l2_length++;
            l2 = l2->next;
        }

        //cout << l1_length << " " << l2_length << endl;
        //选择修改l1; 如果l2长度大于l1,那么swap下hh
        if (l2_length > l1_length) {
            ListNode* temp = l1_head;
            l1_head = l2_head;
            l2_head = temp;
            int temp_length = l1_length;
            l1_length = l2_length;
            l2_length = temp_length;
        }

        l1 = l1_head;
        l2 = l2_head;

        //cout << l1_length << " " << l2_length << endl;

        int oneRes;
        int carryNum = 0;
        while(l1 != NULL) {
            if (l2 != NULL) {
                oneRes = l1->val + l2->val + carryNum;
                carryNum = 0;  //进位加上之后要归零
                if (oneRes >= 10) {
                    oneRes -= 10;
                    carryNum = 1;
                }
                l2 = l2->next;
            } else {
                oneRes = l1->val + carryNum;
                carryNum = 0;
                if (oneRes >= 10) {
                    oneRes -= 10;
                    carryNum = 1;
                }
            }
            l1->val = oneRes;
            if (l1->next != NULL)
                l1 = l1->next;
            else {
                if (carryNum == 1) {
                    ListNode* newL1Node = new ListNode(1);
                    l1->next = newL1Node;
                }
                break;  //l1之后没有了,需要进位进一个推出,不需要就推出
            }
        }
        return l1_head;
    }
};
发布了205 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Alexia23/article/details/104152514