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

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

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

简介

在Java中,可以使用链表来表示数字。这个程序演示了如何用链表表示两个数字,并计算它们的乘积。

实现步骤

首先,需要定义一个链表节点类ListNode,它有两个属性:val用于表示节点存储的数字,next用于指向下一个节点。

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

接下来,需要编写一个方法multiply,它接收两个参数l1l2,分别代表两个数字的链表表示。该方法的实现过程如下:

  1. 定义一个空节点dummy,它是最终结果的头节点。
  2. 定义两个指针p1p2,分别指向链表l1l2的头节点。
  3. 定义一个数组pos,用于保存每一位数字的乘积的进位。
  4. 循环遍历两个链表,同时计算每一位数字的乘积,并将结果加到对应的进位中。
  5. 循环遍历进位数组,将每个位置上的数字都加到结果链表中。
  6. 返回结果链表的头节点。
代码实现
public ListNode multiply(ListNode l1, ListNode l2) {
    ListNode dummy = new ListNode(0);
    ListNode curr = dummy;
    ListNode p1 = l1, p2 = l2;
    int len1 = 0, len2 = 0;
    
    // 计算链表l1的长度
    while (p1 != null) {
        p1 = p1.next;
        len1++;
    }
    
    // 计算链表l2的长度
    while (p2 != null) {
        p2 = p2.next;
        len2++;
    }
    
    // 定义长度为len1+len2的进位数组
    int[] pos = new int[len1 + len2];
    p1 = l1;
    
    // 遍历l1链表
    while (p1 != null) {
        p2 = l2;
        int carry = 0;
        
        // 遍历l2链表并计算乘积
        while (p2 != null) {
            int mul = p1.val * p2.val + pos[len1+len2-1] + carry;
            carry = mul / 10;
            mul = mul % 10;
            pos[len1+len2-1] = mul;
            len2--;
        }
        
        // 处理最后的进位
        pos[len1+len2-1] = carry;
        len1--;
        p1 = p1.next;
    }
    
    // 将进位数组中的数字加到结果链表中
    for (int i = pos.length-1; i >= 0; i--) {
        int sum = pos[i] + curr.val;
        curr.val = sum % 10;
        ListNode node = new ListNode(sum / 10);
        node.next = curr;
        curr = node;
    }
    
    // 跳过前导零
    while (curr.next != null && curr.next.val == 0) {
        curr.next = curr.next.next;
    }
    
    return curr;
}
测试用例
ListNode l1 = new ListNode(1);
l1.next = new ListNode(2);
l1.next.next = new ListNode(3);

ListNode l2 = new ListNode(4);
l2.next = new ListNode(5);
l2.next.next = new ListNode(6);

ListNode result = multiply(l1, l2);

while (result != null) {
    System.out.print(result.val + " ");
    result = result.next;
}

以上程序输出结果为:0 6 7 6 3 8,表示123 * 456 = 56088