两个数相加

本文探讨了两种不同的实现方式来解决将两个链表相加的问题。第一种方法存在逻辑错误导致死循环,通过修复和优化后得出第二种更优的解决方案,该方案使用预设头节点和进位变量,实现了时间复杂度为O(m+n)的高效算法。

一、没看答案前自己写的

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        int l1length = 0;
        ListNode headl1 = l1;
        ListNode headl2 = l2;
        while (l1!=null) {
            l1length++;
            l1 = l1.next;
        }
        int l2length = 0;
        while (l2!=null) {
            l2length++;
            l2 = l2.next;
        }
        ListNode result = null;
        ListNode minNode =null;
        if (l1length > l2length) {
            result = headl1;
            minNode = headl2;
        } else {
            result = headl2;
            minNode = headl1;
            headl1 = headl2;
        }
        int jinwei = 0;
        while(result != null) {
            int minNum = 0;
            if (minNode!=null) {
                minNum = minNode.val;
                minNode = minNode.next;
            }
            if ((minNum+result.val+jinwei) >= 10) {
                result.val = (minNum+result.val+jinwei)%10;
                jinwei = 1;
            } else {
                result.val = minNum + result.val + jinwei;
                jinwei = 0;
            }
            if(result.next == null) {
                l1 = result;
            }
            result = result.next;
        }
        if (jinwei == 1) {
            l1.next = new ListNode(1);
        }
        return headl1;

    }
}

期间在 while(result.next!=null) {

    if(reslut !=null) {

          reslut = result.next;

}

}导致了死循环。自己能做出来,各种修修补补,有个人说得好,好的代码是一起写成的。修修补补的最后都是有问题的。

二、比较好的写法

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode pre = new ListNode(0);
        ListNode cursor = pre;
        int carry = 0;
        while(l1 != null || l2 != null || carry != 0) {
            int l1Val = l1 == null ? 0 : l1.val;
            int l2Val = l2 == null ? 0 : l2.val;
            int sumVal = l1Val + l2Val + carry;
            carry = sumVal / 10;
            
            ListNode sumNode = new ListNode(sumVal % 10);
            cursor.next = sumNode;
            cursor = sumNode;

            if(l1 != null) l1 = l1.next;
            if(l2 != null) l2 = l2.next;
        }

        return pre.next;
    }
}

时间复杂度 O(m+n)

在不同的编程语言中,实现个数相加有多种方法,以下是几种常见编程语言的示例: ### C语言 通过指针传递参数实现个整数相加,代码如下: ```c #include <stdio.h> // 声明并定义函数 int f1(int *x, int *y) { int z; z = *x + *y; return z; } int main() { int a, b; printf("请输入个数:"); scanf("%d,%d", &a, &b); int *x = &a; int *y = &b; printf("个数相加的和为:%d", f1(x, y)); return 0; } ``` 此程序中,定义了`f1`函数,它接收个指针作为参数,通过指针访问存储的值并相加,最后返回相加的结果。在`main`函数里,从键盘读取个整数,将它们的地址赋给指针,再调用`f1`函数计算并输出结果[^1]。 ### Python 可以使用变量来存储输入的数字并相加,也可以在单个语句中执行相加操作: ```python # 使用变量 num1 = float(input('Enter first number: ')) num2 = float(input('Enter second number: ')) print('The sum is %.1f' % (num1 + num2)) # 单个语句执行 print('The sum is %.1f' % (float(input('Enter first number: ')) + float(input('Enter second number: ')))) ``` 上述代码中,第一个示例将用户输入的个数字分别存储在`num1`和`num2`变量中,然后相加并输出结果;第二个示例则直接在`print`函数中获取用户输入并相加输出,不使用额外变量存储输入值[^2]。 ### Android Studio(Java) 在Android开发中,若要实现个数相加,可将输入的字符串转换为`Double`类型(若不想要小数可改为`int`类型)进行计算: ```java String str_num1 = "输入的第一个数字字符串"; String str_num2 = "输入的第二个数字字符串"; Double num1 = Double.valueOf(str_num1); Double num2 = Double.valueOf(str_num2); double sum = num1 + num2; ``` 此代码将输入的字符串转换为`Double`类型,然后将它们相加得到结果。实际应用中,`str_num1`和`str_num2`通常是从用户输入界面获取的字符串[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值