求两个多项式链表的和
难度:
标签:
题目描述
代码结果
运行时间: 309 ms, 内存: 25.1 MB
/*
题目编号: 1634
题目描述: 给定两个表示多项式的链表,计算它们的和并返回一个新的链表表示结果。
每个链表节点包含一个系数和一个指数,并且链表按照指数降序排列。
思路:
1. 使用Stream API处理链表。
2. 将两个链表转为Map<指数, 系数>形式。
3. 合并两个Map并处理相同指数的情况。
4. 将结果转换为链表。
*/
import java.util.*;
import java.util.stream.*;
class ListNode {
int coef;
int exp;
ListNode next;
ListNode(int coef, int exp) {
this.coef = coef;
this.exp = exp;
this.next = null;
}
}
public class Solution {
public ListNode addPolynomial(ListNode poly1, ListNode poly2) {
Map<Integer, Integer> map1 = toMap(poly1);
Map<Integer, Integer> map2 = toMap(poly2);
Map<Integer, Integer> resultMap = new HashMap<>();
map1.forEach((exp, coef) -> resultMap.merge(exp, coef, Integer::sum));
map2.forEach((exp, coef) -> resultMap.merge(exp, coef, Integer::sum));
return toListNode(resultMap);
}
private Map<Integer, Integer> toMap(ListNode poly) {
return Stream.iterate(poly, Objects::nonNull, node -> node.next)
.collect(Collectors.toMap(node -> node.exp, node -> node.coef));
}
private ListNode toListNode(Map<Integer, Integer> map) {
return map.entrySet().stream()
.sorted(Map.Entry.<Integer, Integer>comparingByKey().reversed())
.map(entry -> new ListNode(entry.getValue(), entry.getKey()))
.reduce(null, (next, node) -> { node.next = next; return node; }, (a, b) -> b);
}
}
解释
方法:
这个题解采用了一个类似于合并两个有序链表的方法。首先创建一个虚拟头节点作为返回结果的基础。然后使用两个指针分别遍历两个多项式链表。对于每一对当前节点,比较它们的指数(power)。如果指数相同,则将它们的系数(coefficient)相加,并只在系数非零时添加到结果链表中;如果一个链表的当前节点的指数更大,则将该节点添加到结果链表中,并移动相应的指针。当一个链表遍历完毕后,将另一个链表的剩余部分直接链接到结果链表的尾部。这样就可以得到两个多项式的和。
时间复杂度:
O(m+n)
空间复杂度:
O(m+n)
代码细节讲解
🦆
在比较两个多项式节点的指数时,如果它们的指数相同,为什么选择将系数相加而非创建两个单独的节点?
▷🦆
在处理每个节点时,你如何决定节点的插入顺序,特别是考虑到多项式的标准形式通常要求按指数降序排列?
▷🦆
如果两个输入多项式链表中的一个或两个为空,这种算法如何处理?
▷🦆
在将一个多项式链表的剩余部分直接链接到结果链表的尾部时,是否需要做额外的检查或处理,比如检查系数是否为零?
▷