LeekCode2_链表反向存储+求和(中等)

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头

解题

将长度较短的链表在末尾补零使得两个连表长度相等,再一个一个元素对其相加(考虑进位)

就是将取模后的数值放到结点中,每次相加都算上进位的数,到最后判断如果进位数字大于一,再创建一个结点放入数值。
在这里插入图片描述

//两个数相加
    public listNode2 addSum(listNode2 l1,listNode2 l2){
        //首先设置头结点和引用
        listNode2 head = null,tail = null;
        //设置进位
        int carry = 0;
        while (l1 != null || l2 != null){
            // 取出一个值,如果没有结点,则自动补零
            int i1 = l1 != null ? l1.val:0;
            int i2 = l2 != null ? l2.val:0;
            int sum = i1 + i2 + carry;  //得到本身加进位的
            int other = sum % 10;    //取模得出余数
            if (head == null) {        //如果不存在首节点创建
                head = new listNode2(other);    //给结点赋值
                tail = head;
            }else {
                tail.next = new listNode2(other);
                tail = tail.next;          //将指 针向后移动指向当前结点
            }

            if (l1!= null){
                l1 = l1.next;
            }
            if (l2!=null){
                l2 = l2.next;
            }
        }
        //如果最后还有进位,就需要再创建一个
        if (carry > 0 ){
            tail.next = new listNode2(carry);
        }
        return head;
    }

创建链表并反向存储

正好复习下链表的知识,以下用java写的创建和遍历

public class listNode2 {

    private int val;            //存放数据
    private listNode2 next;     //引用,相当于指针

    //无参构造用于初始化这个类 调用方法
    public listNode2(){}

    //用于初始化结点
    public listNode2(int x){
        this.val = x;
        this.next = null;
    }

    //用于创建结点(逆序存储数组中的数)
    public void create(int a[],listNode2 head){

        listNode2 tail = head;//一个变量,相当于指针移动
        for (int i = a.length-2; i >=0 ; i--) {
            listNode2 first = new listNode2(a[i]);//下一个结点
            tail.next = first;  //将结点连接起来
            tail = tail.next;   //移动到下一个结点
        }
        //遍历
        list(head);
    }

    //遍历链表
    public void list(listNode2 head){

        listNode2 tail = head;//定义一个变量用于遍历
        System.out.print("链表:");
        while (tail != null){
            System.out.print(tail.val+" ");
            tail = tail.next;
        }
        System.out.println();
    }

    //两个数相加
    public listNode2 addSum(listNode2 l1,listNode2 l2){
        //首先设置头结点和引用
        listNode2 head = null,tail = null;
        //设置进位
        int carry = 0;
        while (l1 != null || l2 != null){
            // 取出一个值,如果没有结点,则自动补零
            int i1 = l1 != null ? l1.val:0;
            int i2 = l2 != null ? l2.val:0;
            int sum = i1 + i2 + carry;  //得到本身加进位的
            int other = sum % 10;    //取模得出余数
            if (head == null) {        //如果不存在首节点创建
                head = new listNode2(other);    //给结点赋值
                tail = head;
            }else {
                tail.next = new listNode2(other);
                tail = tail.next;          //将指 针向后移动指向当前结点
            }

            if (l1!= null){
                l1 = l1.next;
            }
            if (l2!=null){
                l2 = l2.next;
            }
        }
        //如果最后还有进位,就需要再创建一个
        if (carry > 0 ){
            tail.next = new listNode2(carry);
        }
        return head;
    }
}

测试

public static void main(String[] args) {
        int l1[]={2,4,3};
        listNode2 list = new listNode2(l1[l1.length-1]);  //逆序数组创建头结点
        list.create(l1,list);

        int l2[]={5,6,4};
        listNode2 list2 = new listNode2(l2[l2.length-1]);  //逆序数组创建头结点
        list2.create(l2,list2);

        //测试结果两数之和
        listNode2 listNode2 = list.addSum(list, list2);
        list.list(listNode2);

    }

结果

链表:3 4 2
链表:4 6 5
链表:7 0 8

链表归并是指将两个有序链表合并成一个有序链表的过程。实验11_9的目的是通过链表归并的实现,加深对链表操作的理解和应用。 具体实现步骤如下: 1. 定义一个链表结构体Node,包含一个整型数据域和一个指向下一个节点的指针域。 2. 定义一个链表归并函数merge,输入参数为两个链表的头节点指针head1和head2,输出参数为归并后的链表头节点指针head3。 3. 在merge函数内部,定义一个临时节点指针p,将其指向头节点较小的那个链表的头节点,将头节点较大的那个链表的头节点赋值给head3。 4. 在while循环中,判断p的指针域是否为空,如果为空,则将p的指针域指向头节点较大的那个链表的头节点,并将该链表的头节点指针head3赋值给p。 5. 在while循环中,判断p所指向的节点的数据域与另一个链表头节点的数据域的大小关系,将p的指针域指向数据域较小的节点。 6. 在while循环结束后,将剩余的节点直接接到归并后的链表尾部。 完整代码如下: ``` #include<iostream> using namespace std; struct Node{ int data; Node* next; }; Node* merge(Node* head1,Node* head2){ if(head1==NULL) return head2; if(head2==NULL) return head1; Node* head3=NULL; Node* p=NULL; if(head1->data<head2->data){ p=head1; head1=head1->next; } else{ p=head2; head2=head2->next; } head3=p; while(head1!=NULL&&head2!=NULL){ if(head1->data<head2->data){ p->next=head1; head1=head1->next; } else{ p->next=head2; head2=head2->next; } p=p->next; } if(head1!=NULL) p->next=head1; if(head2!=NULL) p->next=head2; return head3; } int main(){ Node* head1=new Node; Node* head2=new Node; Node* p1=head1; Node* p2=head2; int n,m; cout<<"请输入第一个链表的长度:"; cin>>n; cout<<"请输入第一个链表的元素:"; for(int i=0;i<n;i++){ int x; cin>>x; Node* node=new Node; node->data=x; p1->next=node; p1=node; } cout<<"请输入第二个链表的长度:"; cin>>m; cout<<"请输入第二个链表的元素:"; for(int i=0;i<m;i++){ int x; cin>>x; Node* node=new Node; node->data=x; p2->next=node; p2=node; } Node* head3=merge(head1->next,head2->next); cout<<"合并后的链表为:"; while(head3!=NULL){ cout<<head3->data<<" "; head3=head3->next; } cout<<endl; return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值