leedcode 2. 两数相加 - 链表式 大数相加

题目描述

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

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

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

示例:

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

主要考察点:链表(指针),大数相加

代码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) {
        ListNode* head1 = l1;
        ListNode* head2 = l2;
       	ListNode head(0);
       	ListNode *end = &head;
       	int lastmod = 0;
       	while(l1 || l2 || lastmod){		
       		int L_one = l1 ? l1->val: 0;
       		int L_two = l2 ? l2->val: 0;   		
		int cou_num = L_one + L_two + lastmod;		
		ListNode *temp = new ListNode(cou_num%10);
		end -> next = temp;
		end = end->next;		
		l1 = l1&&l1->next ? l1->next: NULL;
		l2 = l2&&l2->next ? l2->next: NULL;
		lastmod = cou_num / 10; 
	}
	return head.next;
    }
};

代码2:

我刚开始把链表转化数组了

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head1 = l1;
        ListNode* head2 = l2;
        vector<int> v1;
        vector<int> v2;
        while(l1){
            v1.push_back(l1->val);
            l1 = l1->next;
        }
        while(l2){
            v2.push_back(l2->val);
            l2 = l2 -> next;
        }
        
        int leng = v1.size()>v2.size()?v1.size():v2.size();
        vector<int> ans(leng);

        int mod = 0;
        int tmp = 0;
        for(int i = 0;i < leng;i ++){
            int t1 = i < v1.size() ? v1[i] : 0;
	    int t2 = i < v2.size() ? v2[i] : 0;
	    int kk = t1 + t2;
            tmp = kk / 10;
            mod = kk % 10;
            if(i< leng - 1)
            {
                if(v1.size()>v2.size()){
                    v1[i+1] += tmp;
                }
                else{
                    v2[i+1] += tmp;
                }
            }
            ans[i] = mod;  
        }
        while(tmp)
        {
            ans.push_back(tmp%10);
            tmp /= 10;
        }
        ListNode head(0);
        ListNode *next = &head;
        for(int i = 0; i<ans.size(); i++)
        {
            ListNode * kk = new ListNode(ans[i]);
            next->next = kk;
            next = next->next;
        }
        return head.next;
    }
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值