力扣2两数相加题解
程序员文章站
2022-06-11 18:46:25
...
1.题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
2.想法
由于本人对于java的链表操作不是很熟悉,故先将两个链表转化为两个数组进行处理,按题目所给意思即将数组一每位与数组二每位相加,若大于10则产生进位,组成链表三。与平时笔算加法顺序相同。
3.图解
来源:力扣(LeetCode)官方题解
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)
下一篇: ORBSLAM2单应矩阵计算及代码分析