Leetcode(C++)——2. 两数相加

2. 两数相加

①题目描述

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

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

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

②示例

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

③解法

方法一:逐位相加

从各位开始逐渐向高位前进,类似小学的加法。

时间复杂度为O(max(l1,l2))。

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *head = new ListNode(0);
        ListNode *p = l1, *q = l2, *end = head;
        int flag = 0;
		while(p || q) {
			int x = (p != NULL)?p->val:0;
			int y = (q != NULL)?q->val:0;
			int sum = x + y + flag;
			flag = sum / 10;
			end->next = new ListNode(sum % 10);
			end = end->next;
			if(p != NULL) p = p->next;
			if(q != NULL) q = q->next;
		} 
		if(flag > 0) end->next = new ListNode(flag);
		return head->next;
    }
};

Leetcode的测试结果:
在这里插入图片描述

方法二:链表转化为数字,自然相加减

1、链表l1 l2转化为数字
2、两数字相加
3、数字转化为链表
只能通过小的数测试,太大的数没法计算,没能通过leetcode的大数测试。

class Solution {
public:
	int list2num(ListNode *head) {
		ListNode *tmp;
		if(head == NULL) return 0;
		tmp = head;
		int num = 0, count = 0;
		while(tmp) {
			//cout<val<<"==>";
			num += tmp->val * pow(10, count++);
			tmp = tmp->next;
		}
		//cout<= 10) {
			//cout<<"num:"<val = num % 10;
			p->next = NULL;
			if(flag == 0) {
				head = p;
				end = p;
				flag = 1;
			}
			else {
				end->next = p;
				end = p;
			}
			//print_list(head);
			num = num / 10;
		}
		if(num != 0) {
			ListNode *p1 = new ListNode(-1);
			p1->val = num;
			p1->next = NULL;
			end->next = p1;
		}
		return head;
	}
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int total = list2num(l1) + list2num(l2);
        //cout<<"total:"<

Leetcode的测试结果:
Leetcode(C++)——2. 两数相加_第1张图片

④总结

暂时没找到大佬超过99%的解法,以后有思绪的话继续补充!

你可能感兴趣的:(Leetcode(C++))