题目

给你两个链表,返回第三个链表,第三个链表表示前两个链表的乘积,计算过程不能使用任何其他数据结构。
node节点结构

class Node {
int v;
Node next;

Node(int v) {
this.v = v;
}
}

示例
输入:
a:7->4->1
b:8->5->2
返回:
c:6->3->1->3->3->2

算法

public class Solution {
static class Node {
int v;
Node next;

Node(int v) {
this.v = v;
}
}

public static Node multiply(Node a, Node b) {
Node node = multiplyIn(a, b);

//对node节点进行进位处理
int pre = 0;
Node head = node;
Node preNode = null;
while (node != null) {
int value = node.v;
node.v = (value + pre) % 10;
pre = (value + pre) / 10;
preNode = node;
node = node.next;
}
if (pre > 0) {
preNode.next = new Node(pre);
}
return reverse(head);
}

public static Node multiplyIn(Node a, Node b) {
//链表反转,便于计算
Node aR = reverse(a);
Node bR = reverse(b);

Node tempA = aR;
Node res = new Node(0);

//对每一位相乘,把乘积只存在当前位中,比如十位和十位相乘,就把最后的结果存在百位中,最后再处理进位
Node start = res;
while (tempA != null) {

Node tempB = bR;
Node temp = start;
while (tempB != null) {
int value = tempA.v * tempB.v;
temp.v += value;
if (temp.next == null) {
temp.next = new Node(0);
}
tempB = tempB.next;
temp = temp.next;
}

if (start.next == null) {
start.next = new Node(0);
}

start = start.next;
tempA = tempA.next;
}
return res;
}

private static Node reverse(Node node) {
Node head = null;
while (node != null) {
Node next = node.next;
node.next = head;
head = node;
node = next;
}
return head;
}
}

测试

public static void main(String[] args) {
Node a = new Node(7);
a.next = new Node(4);
a.next.next = new Node(1);
a.next.next.next = new Node(8);
a.next.next.next.next = new Node(5);
a.next.next.next.next.next = new Node(2);

Node b = new Node(8);
b.next = new Node(5);
b.next.next = new Node(2);
b.next.next.next = new Node(9);
b.next.next.next.next = new Node(6);
b.next.next.next.next.next = new Node(3);

Node result = multiply(a, b);
while (result != null) {
System.out.println(result.v + " ");
result = result.next;
}
}