两个链表生成相加链表

题目描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。

给定两个这种链表,请生成代表两个整数相加值的结果链表。

例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

示例1

输入

[9,3,7],[6,3]

返回值

{1,0,0,0}
//方法二:使用栈,不需要反转链表
    public ListNode addInListII(ListNode head1, ListNode head2) {
        Stack<Integer> s1 = new Stack<>();
        Stack<Integer> s2 = new Stack<>();
        ListNode p1 = head1, p2 = head2;

        while (p1 != null) {
            s1.push(p1.val);
            p1 = p1.next;
        }
        while (p2 != null) {
            s2.push(p2.val);
            p2 = p2.next;
        }
        int carry = 0;
        ListNode dummy = new ListNode(-1);
        while (!s1.empty() || !s2.empty() || carry != 0) {
            int sum = carry;
            if (!s1.empty()) {
                sum += s1.pop();
            }
            if (!s2.empty()) {
                sum += s2.pop();
            }
            ListNode cur = new ListNode(sum % 10);
            cur.next = dummy.next;
            dummy.next = cur;
            carry = sum / 10;
        }
        return dummy.next;
    }

    //方法一:先反转两链表
    //定义虚拟节点dummy和prev,prev指向dummy
    //定义进位carry,循环遍历两链表,将两链表的值相加,并将prev指针指向相加的值
    //最后将相加后链表再反转即可
    //时间复杂度O(max(m,n)),其中m,n为两链表的长度
    //空间复杂度O(max(m,n))
    public ListNode addInListI(ListNode head1, ListNode head2) {
        ListNode l1 = reverse(head1);
        ListNode l2 = reverse(head2);

        ListNode dummy = new ListNode(-1);
        ListNode prev = dummy;
        int carry = 0;
        while (l1 != null || l2 != null || carry != 0) {
            int sum = carry;
            if (l1 != null) {
                sum += l1.val;
                l1 = l1.next;
            }
            if (l2 != null) {
                sum += l2.val;
                l2 = l2.next;
            }
            prev.next = new ListNode(sum % 10);
            prev = prev.next;
            carry = sum / 10;
        }
        return reverse(dummy.next);
    }

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 链表可以用来实现多项式的相加,可以考虑以下步骤: 1. 定义一个节点表示多项式的每一项,包含两个成员变量:系数和指数。 2. 定义一个链表,每个节点表示多项式的一项。 3. 将多项式转换为链表,按照指数从高到低的顺序插入节点,如果插入的指数已经存在,则将系数相加。 4. 遍历两个链表,将对应指数的系数相加生成结果链表。 以下是一个 C++ 代码示例: ```cpp #include <iostream> using namespace std; struct PolyNode { int coef; // 系数 int expn; // 指数 PolyNode* next; }; void createPolyList(PolyNode*& head) { int n; cout << "请输入多项式项数:"; cin >> n; head = new PolyNode; head->next = NULL; PolyNode* p = head; for (int i = 1; i <= n; i++) { PolyNode* node = new PolyNode; cout << "请输入第" << i << "项的系数和指数:"; cin >> node->coef >> node->expn; node->next = NULL; p->next = node; p = node; } } void printPolyList(PolyNode* head) { PolyNode* p = head->next; while (p) { cout << p->coef << "x^" << p->expn; p = p->next; if (p) cout << " + "; } cout << endl; } void addPolyList(PolyNode* head1, PolyNode* head2, PolyNode*& head3) { PolyNode* p1 = head1->next; PolyNode* p2 = head2->next; head3 = new PolyNode; head3->next = NULL; PolyNode* p3 = head3; while (p1 && p2) { if (p1->expn < p2->expn) { PolyNode* node = new PolyNode; node->coef = p1->coef; node->expn = p1->expn; node->next = NULL; p3->next = node; p3 = node; p1 = p1->next; } else if (p1->expn > p2->expn) { PolyNode* node = new PolyNode; node->coef = p2->coef; node->expn = p2->expn; node->next = NULL; p3->next = node; p3 = node; p2 = p2->next; } else { PolyNode* node = new PolyNode; node->coef = p1->coef + p2->coef; node->expn = p1->expn; node->next = NULL; p3->next = node; p3 = node; p1 = p1->next; p2 = p2->next; } } while (p1) { PolyNode* node = new PolyNode; node->coef = p1->coef; node->expn = p1->expn; node->next = NULL; p3->next = node; p3 = node; p1 = p1->next; } while (p2) { PolyNode* node = new PolyNode; node->coef = p2->coef; node->expn = p2->expn; node->next = NULL; p3->next = node; p3 = node; p2 = p2->next; } } int main() { PolyNode* head1, * head2, * head3; createPolyList(head1); createPolyList(head2); addPolyList(head1, head2, head3); cout << "多项式1:"; printPolyList(head1); cout << "多项式2:"; printPolyList(head2); cout << "相加结果:"; printPolyList(head3); return 0; } ``` 该程序通过 createPolyList 函数创建两个多项式的链表,再通过 addPolyList 函数实现多项式相加,并将结果存储在 head3 中,最后通过 printPolyList 函数输出结果链表。 ### 回答2: 数据结构中的链表是由一系列节点组成的动态数据结构,其中每个节点包含两部分:数据域和指针域。数据域用于存储数据元素,而指针域用于指向下一个节点。 多项式相加是指将两个多项式相加得到一个新的多项式。多项式可以看作由一系列项组成,每个项包含一个系数和一个指数。例如,多项式4x^3 + 2x^2 + 5x + 1可以表示为链表的形式:(4, 3) -> (2, 2) -> (5, 1) -> (1, 0)。 对于链表的多项式相加,可以按照以下步骤进行操作: 1. 创建两个链表,用来存储两个多项式的和。 2. 从两个多项式的头节点开始,依次比较指数的大小。 3. 如果指数相同,将两个多项式的系数相加,并创建一个新节点将其存储到链表中。 4. 如果其中一个多项式的指数较小,将对应的节点复制到和链表中。 5. 继续以上步骤,直到遍历完两个多项式。 6. 如果有一个多项式还有项未处理,则将其余的项都复制到和链表中。 最终得到的和链表中包含了输入的两个多项式的和。我们可以根据需要对和链表进行进一步的处理,比如输出到屏幕上或者存储到文件中。 链表作为一种灵活而常用的数据结构,可以被广泛应用于多项式相加、图形算法等领域。通过合理地使用链表,我们可以高效地实现多项式相加的操作。 ### 回答3: 数据结构中,多项式的相加可以使用链表来实现。链表是一种常用的数据结构,它由一系列节点组成,每个节点包含一个数据元素和指向下一个节点的指针。 在多项式相加中,我们可以将每个项表示为一个节点,并按照指数从小到大的顺序插入到链表中。每个节点包含两个数据元素,一个是系数,另一个是指数,这样可以很方便地表示多项式的每一项。 首先,我们需要创建两个链表,分别表示两个多项式。然后,我们按照项的指数顺序将每个项插入到链表中。当插入时,我们需要比较当前项的指数与链表中已存在的项的指数大小来确定插入位置。 在插入过程中,如果遇到两个节点的指数相同,我们需要将它们的系数相加并更新对应节点的系数值。如果链表中不存在对应的指数,则直接将新的节点插入到链表中。 最后,我们可以将链表中的每个节点打印出来,即可得到多项式相加的结果。需要注意的是,我们在输出结果时,可以根据节点的系数值是否为零来决定是否输出该项,以避免输出不必要的项。 使用链表来实现多项式的相加,可以保持多项式的有序性,同时避免使用数组或其他线性结构时的元素移动或扩容操作,提高了插入和删除的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值