欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

力扣2两数相加题解

程序员文章站 2022-06-11 18:46:25
...

1.题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
2.想法
由于本人对于java的链表操作不是很熟悉,故先将两个链表转化为两个数组进行处理,按题目所给意思即将数组一每位与数组二每位相加,若大于10则产生进位,组成链表三。与平时笔算加法顺序相同。
3.图解
来源:力扣(LeetCode)官方题解
力扣2两数相加题解4.注意点
(1)两个链表有可能一个为空
(2)两个链表有可能某个较短
(3)可能产生最高位进位(看了提示才知道的)
5.自己题解

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int num1=0;
        ListNode p=l1;
        ListNode q=l2;
        while(l1!=null) {num1++;l1=l1.next;}
       // System.out.print(num1);
        int num2=0;
        while(l2!=null){num2++;l2=l2.next; }
        int []a1=new int[num1];//保存链表一
        int []a2=new int[num2];//保存链表二
        l1=p;l2=q;
        int single1=0;int single2=0;//记录链表一与二的长度
        while(p!=null)
        {
            a1[single1]=p.val;
            p=p.next;
            single1++;
        }
        //System.out.print(a1[2]);
        while(q!=null)
        {
            a2[single2]=q.val;
            q=q.next;
            single2++;
        }
        int jinwei=0;//进位标志
        int max=single1>single2?single1:single2;//找到链表一与二长度的最大值
        int []sum=new int[max+1];//结果数组
        int min=single1<single2?single1:single2;//找到链表一与二长度的最小值
        for(int i=0;i<min;i++)
        {
            int x=jinwei+a1[i]+a2[i];
sum[i]=x%10;
jinwei=x/10;
        }
        for(int i=min;i<max;i++)
        {
           if(single1>single2)
           {int x=jinwei+a1[i];
            sum[i]=x%10;
             jinwei=x/10;}
           else{
             int x=jinwei+a2[i];
            sum[i]=x%10;
             jinwei=x/10;  
           } 
        }
        if(jinwei!=0){sum[max]=1;}
        //for(int i=0;i<max+1;i++)
        //{System.out.print(sum[i]);}
        ListNode head=new ListNode(0);
        ListNode l3=head;
        for(int i=0;i<max;i++)
        {
            l3.next=new ListNode(sum[i]);
            l3=l3.next;
        }
        if(sum[max]!=0){l3.next=new ListNode(sum[max]);}
        return head.next; 
    }
}

6.知识点
(1)创建链表
先创建一个头节点head,再创建链接在头节点后面的节点l,并先使它等于head,继而用l.next链接新节点,让l.next赋给l,最终head.next即为所要链表。
7.官方题解

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode dummyHead = new ListNode(0);
    ListNode p = l1, q = l2, curr = dummyHead;
    int carry = 0;
    while (p != null || q != null) {
        int x = (p != null) ? p.val : 0;
        int y = (q != null) ? q.val : 0;
        int sum = carry + x + y;
        carry = sum / 10;
        curr.next = new ListNode(sum % 10);
        curr = curr.next;
        if (p != null) p = p.next;
        if (q != null) q = q.next;
    }
    if (carry > 0) {
        curr.next = new ListNode(carry);
    }
    return dummyHead.next;
}

作者:LeetCode
链接:两数相加题解
来源:力扣(LeetCode)

相关标签: 力扣 leetcode