码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode T2 两数相加详解

时间:2019-10-20 10:56:52      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:lse   lin   struct   ddt   ini   方法   val   tab   过程   

两数相加

题目描述

给出两个?非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照?逆序?的方式存储的,并且它们的每个节点只能存储?一位?数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0?开头。

示例:

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

详细题解

加法模拟,使用变量carry来跟踪进位,并从包含最低有效位的表头开始模拟逐位相加的过程。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    struct ListNode *result = NULL;
    struct ListNode *l3 = NULL;
    int carry = 0;
    int val1, val2;
    
    if (!l1 && !l2) {
        return NULL;
    }
    
    while (l1 || l2 || carry) {
        if (l1) {
            val1 = l1->val;
            l1 = l1->next;
        } else {
            val1 = 0;
        }
        
        if (l2) {
            val2 = l2->val;
            l2 = l2->next;
        } else {
            val2 = 0;
        }
        
        if (!l3) {
            l3 = malloc(sizeof(struct ListNode));
            assert(l3 != NULL);
            result = l3;
            
        } else {
            l3->next = malloc(sizeof(struct ListNode));
            assert(l3->next != NULL);
            l3 = l3->next;
        }
        
        l3->val = (val1 + val2 + carry) % 10;
        l3->next = NULL;
        carry = (val1 + val2 + carry) / 10;
    }
    
    return result;
}
方法 时间复杂度 空间复杂度 结果 时间 内存
方法 时间复杂度 空间复杂度 结果 时间 内存
模拟加法 O(max(l1.len, l2.len)) O(max(l1.len, l2.len)) 通过 24ms 8.9M

?
?
?
?
?
?

leetcode T2 两数相加详解

标签:lse   lin   struct   ddt   ini   方法   val   tab   过程   

原文地址:https://www.cnblogs.com/xiaoxxmu/p/11706803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!