📌  相关文章
📜  用链表表示的两个数字相加的Java程序 - 集 1(1)

📅  最后修改于: 2023-12-03 15:40:56.228000             🧑  作者: Mango

使用链表表示的两个数字相加的Java程序

简介

这是一个使用链表表示的两个数字相加的Java程序。该程序使用链表作为数据结构,进行数字相加运算,实现了对大数的加法操作。这个程序的时间复杂度为O(n),空间复杂度为O(n1+n2),其中n1和n2分别是两个数字的位数。

代码

以下是使用链表表示的两个数字相加的Java程序代码:

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public class AddTwoNumbers {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0);
        ListNode cur = dummy;
        int carry = 0;
        while(l1 != null || l2 != null || carry != 0) {
            int sum = carry;
            if(l1 != null) {
                sum += l1.val;
                l1 = l1.next;
            }
            if(l2 != null) {
                sum += l2.val;
                l2 = l2.next;
            }
            cur.next = new ListNode(sum % 10);
            carry = sum / 10;
            cur = cur.next;
        }
        return dummy.next;
    }
}
代码解释
  1. 首先定义一个ListNode类,它是链表节点的抽象表示。该类包含一个整型数据val和一个指向下一个节点的指针next。

  2. 定义一个AddTwoNumbers类,它包含一个方法addTwoNumbers,用于实现链表表示的两个数字的相加。该方法接受两个链表节点l1和l2作为参数,返回一个链表节点作为结果。

  3. 在addTwoNumbers方法中,首先定义一个dummy节点,并将cur指针指向dummy节点。同时定义一个carry变量,初始值为0。

  4. 使用while循环,判断l1和l2是否为空,carry是否为0。如果不是,则继续循环。

  5. 在循环内,首先将carry赋值给sum变量。然后判断l1和l2是否为空,如果不为空,则将l1和l2节点的值与sum变量相加。然后将l1和l2移动到它们的下一个节点。

  6. 然后将sum取模10,得到进位后的当前节点的数值,创建一个新的链表节点,并将当前节点的next指针指向这个新的节点。将sum除以10并赋值给carry变量,得到进位后的值。

  7. 将cur指针移动到当前节点的下一个节点。

  8. 循环结束后,返回dummy.next表示结果。

总结

使用链表表示的两个数字相加的Java程序是一种非常高效的算法,能够处理大数相加的问题。它的时间复杂度为O(n),空间复杂度为O(n1+n2),能够满足绝大多数实际应用的需要。