📅  最后修改于: 2023-12-03 15:40:56.199000             🧑  作者: Mango
在Java中,可以使用链表来表示数字。这个程序演示了如何用链表表示两个数字,并计算它们的乘积。
首先,需要定义一个链表节点类ListNode
,它有两个属性:val
用于表示节点存储的数字,next
用于指向下一个节点。
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
接下来,需要编写一个方法multiply
,它接收两个参数l1
和l2
,分别代表两个数字的链表表示。该方法的实现过程如下:
dummy
,它是最终结果的头节点。p1
和p2
,分别指向链表l1
和l2
的头节点。pos
,用于保存每一位数字的乘积的进位。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
。