两个单连生成相加链表

有两个单链表。代表两个非负数,每个节点代表一个数位。数字是反向存储的。即第一个结点表示最低位。最后一个结点表示最高位。求两个数的相加和,而且以链表形式返回。
import java.util.Stack;

/**
 * Created by 糖糖 on 2017/8/7.
 */
public class addList {
    public static node addList(node n1,node n2){
        Stack<node> s1 = new Stack<>();
        Stack<node> s2 = new Stack<>();
        while (n1!=null){
            s1.add(n1);
            n1 = n1.next;
        }
        while (n2 != null){
            s2.add(n2);
            n2 = n2.next;
        }
        int ca = 0;
        int p = 0;
        int q = 0;
        node pre = null;
        node cur = null;
        int sum = 0;
        while (!s1.isEmpty()||!s2.isEmpty()){
            p = s1.isEmpty()? 0 :s1.pop().data;
            q = s2.isEmpty()?0:s2.pop().data;
            sum = p+q+ca;
            pre = cur;
            cur = new node(sum%10);
            ca = sum/10;
            cur.next = pre;
        }
        if(ca==1){
            pre = cur;
            cur = new node(1);
            cur.next = pre;
        }
        return  cur;
    }
    /*
    先将两个链表翻转,然后直接相加,就省掉了两个栈的空间
     */
    public static  node addList2(node head1,node head2){
        head1 = reserve(head1);
        head2 = reserve(head2);

        int ca =0;
        int p = 0;
        int q =0;
        int sum = 0;
        node n1 = null;
        node n2 = null;
        node c1 = head1;
        node c2 = head2;
        while (c1!=null || c2!=null){
            p = c1==null?0:c1.data;
            q = c2==null?0:c2.data;
            sum = p+q+ca;
            n1 = n2;
            n2 = new node(sum%10);
            n2.next = n1;
            ca = sum/10;
            c1 = c1==null?null:c1.next;
            c2 = c2==null?null:c2.next;
        }

        if(ca!=0){
            n1 = n2;
            n2 = new node(1);
            n2.next = n1;
        }
        reserve(head1);
        reserve(head2);
        return  n2;
    }

    public  static node reserve(node head){
        node pre = null;
        node cur = head;
        node next = null;
     while (cur != null){
         next = cur.next;
         cur.next = pre;
         pre = cur;
         cur = next;
     }
     return  pre;
    }

    public  static void main(String args[]){
        node n1=new node(2);
        node n2=new node(5);
        node n3=new node(6);
        node n4=new node(7);
        n1.next=n2;
        n2.next=n3;
        n3.next=n4;
        node n5=new node(2);
        node n6=new node(6);
        node n7=new node(1);
        //n4.next=n5;
        n5.next=n6;
        n6.next=n7;


        //node res = addList(n1,n5);
        node res = addList(n1,n5);
        while (res != null){
            System.out.print(res.data+" ");
            res = res.next;
        }
    }
}
  • 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、付费专栏及课程。

余额充值