Leetcode 热题2. 两数相加(c++,完整版代码)

注:c++完整版代码,参考了评论区大神的方法,主要用于自测验证

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

示例 1:


输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

核心代码有注释,非常便于理解

#include 
#include 
#include 
using namespace std;

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

//两数相加 
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
	//创建虚拟表头指针,默认为-1; 
	ListNode *res = new ListNode(-1);
	//指向链表表头的指针,用于返回值 
	ListNode *cur = res;
	ListNode *del = cur;
	int carry = 0;
	while (l1 || l2 )
    {
		//l1和l2当前位是否为空,不存在用0补上
		int l1val = l1 ? l1->val : 0;
		int l2val = l2 ? l2->val : 0; 
		int sum = l1val + l2val + carry; 
		carry = sum / 10;
		// cur->next保存各位的数值 
		cur->next = new ListNode(sum % 10);
		cur = cur->next;
		if (l1) l1 = l1->next;
		if (l2) l2 = l2->next; 
	}
	//最高位有进位,在最前面补1 
	if (carry) cur->next = new ListNode(1); 
	return res->next;
	free (del);
    }
};


ListNode* createListNode(std::vector vals);
void freeListNode(ListNode* head);
void printListNode(ListNode* head);

int main()
{
    auto l1 = createListNode({1, 2, 3});
    auto l2 = createListNode({9, 8, 7, 6});
    printListNode(l1);
    printListNode(l2);
    Solution s;
    auto sum = s.addTwoNumbers(l1, l2);
    printListNode(sum);
    freeListNode(l1);
    freeListNode(l2);
    freeListNode(sum);
    return 0;
}

//链表创建
 ListNode* createListNode(std::vector vals) 
{	
	//c11新特性, nullptr空指针类型的关键字 
    ListNode *res = nullptr;
    ListNode *last = nullptr;
    for(auto val : vals) {
        if(last) {
            last->next = new ListNode(val);
            last = last->next;
        }
        else {
            res = new ListNode(val);
            last = res;
        }
    }
    return res;
}

//链表输出
void printListNode(ListNode* head)
{
    ListNode* node = head;
    while(node) {
        std::cout << node->val << ", ";
        node = node->next;
    }
    std::cout << std::endl;
}

//释放内存 
void freeListNode(ListNode* head)
{
    ListNode* node = head;
    while(node) {
        auto temp = node->next;
        delete node;
        node = temp;
    }
}




你可能感兴趣的:(LeetCode热题100,mysql,数据库,database)