leetcode
leetcode 1501 ~ 1550
求两个多项式链表的和

求两个多项式链表的和

难度:

标签:

题目描述

代码结果

运行时间: 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)

代码细节讲解

🦆
在比较两个多项式节点的指数时,如果它们的指数相同,为什么选择将系数相加而非创建两个单独的节点?
在多项式的运算中,具有相同指数的项被视为同类项。对同类项进行计算时,需要将系数相加以简化多项式的表示。创建两个单独的节点会导致相同指数的项分散在链表中,这不仅增加了处理的复杂度,还与多项式的标准简化形式相悖。因此,将系数相加是为了保持多项式的简洁和规范性。
🦆
在处理每个节点时,你如何决定节点的插入顺序,特别是考虑到多项式的标准形式通常要求按指数降序排列?
在算法实现中,通过比较两个节点的指数来决定节点的插入顺序。如果一个节点的指数高于另一个,那么它会先被添加到结果链表中,从而保证了多项式的指数是按降序排列的。这种方式确保了即使在合并过程中,结果多项式的节点也总是保持正确的顺序。
🦆
如果两个输入多项式链表中的一个或两个为空,这种算法如何处理?
如果输入中的一个或两个多项式链表为空,算法会直接将非空的多项式链表的剩余部分链接到结果链表的尾部。如果两个链表都为空,则结果链表也为空。这种处理方式确保了算法的鲁棒性和正确处理边界情况的能力。
🦆
在将一个多项式链表的剩余部分直接链接到结果链表的尾部时,是否需要做额外的检查或处理,比如检查系数是否为零?
在实现中,当将一个多项式链表的剩余部分直接链接到结果链表时,通常不需要对每个节点的系数是否为零进行额外检查。这是因为在主循环中已处理了系数为零的情形(通过将相同指数的系数相加并检查结果),因此剩余部分中的系数理应非零。然而,根据具体情况和多项式链表的来源,如果有可能出现系数为零的节点,则应添加检查以避免添加无效节点。

相关问题