难度中等5287收藏分享切换为英文接收动态反馈
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
解法一:Java,执行用时: 2ms,内存消耗:38.7 MB,
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p1=l1;
ListNode p2=l2;
ListNode result=new ListNode(0);
ListNode p3=result;
int t1=0;//保存进位
while(p1!=null&&p2!=null)
{
p3.next=new ListNode(0,null);
p3=p3.next;
int t2=p1.val+p2.val+t1;
if(t2<10){
t1=0;//下一次无进位
}
else{
t2=t2-10;
t1=1;//下一次进位1
}
p3.val=t2;
p1=p1.next;
p2=p2.next;
}
if(p1==null)//使p1指向未加完的数
p1=p2;
while(p1!=null||t1!=0)//存在一边未遍历完或者有进位
{
int t2;
if(p1!=null)
t2=p1.val+t1;
else
t2=t1;
if(t2<10){
t1=0;
}
else{
t2=t2-10;
t1=1;
}
p3.next=new ListNode(0,null);
p3=p3.next;
p3.val=t2;
if(p1!=null)
p1=p1.next;
}
return result.next;
}
}
解法二:Java,时间快,用一个链表保存结果,有一个链表未遍历完,而需要进位时,另一个链表同步增长(0,null)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode result =new ListNode(0);
ListNode p=result;
while(l1!=null&&l2!=null)//左右均不为空时
{
int sum=l1.val+l2.val;//保存两个链表的和
if(sum<10)
l1.val=sum;//两相加结果保存在l1中
else{//需要进位时
l1.val=sum%10;
if(l1.next==null){//需要进位时,若下一个结点为null,则新建一个结点,且赋值为1便于操作。
ListNode newNode=new ListNode(1,null);
l1.next=newNode;
}
else if(l2.next==null){
ListNode newNode=new ListNode(1,null);
l2.next=newNode;
}
else//若下一位没有空结点,则l1链表下一位直接+1
l1.next.val=l1.next.val+1;
}
p.next=l1;//使结果链表下一位等于处理完的当前l1结点
l1=l1.next;
l2=l2.next;
p=p.next;
}
if(l1==null)
p.next=l2;
return result.next;
}
}
解法三:Java,耗内存低
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode root1 = l1;
ListNode root2 = l2;
ListNode l3 = new ListNode(0);//结果链表
ListNode root3 = l3;
while (root1 != null || root2 != null) {//当有一个工作指针不为null时
int num1 = root1 != null ? root1.val : 0;//临时存值,若工作指针为空则取0
int num2 = root2 != null ? root2.val : 0;
int sum = num1 + num2;//两个链表对应结点值求和
int num = root3.val;//保存当前结点的值
root3.val = (sum + num) % 10;//最终结果保存到当前节点
root1 = root1 != null ? root1.next : root1;//若工作指针下一个结点不为0,则指针后移
root2 = root2 != null ? root2.next : root2;
if (root1 != null || root2 != null || (sum + num) / 10 != 0) {//当有一个指针不为空或者当前结点值存在进位时
root3.next = new ListNode((sum + num) / 10);//结果链表添加新结点,并加上进位值
root3 = root3.next;//指针后移
}
}
return l3;
}
}