两数之和

两数之和

前言

用两个链表分别表示两个非负整数,一个节点就是一个数字,用逆序存储数字,并且每个节点只能存储一位数字

/**
* 默认已有的链表节点类
* 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; }
* }
*/

思路

由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加。

我们同时遍历两个链表,逐位计算它们的和,并与当前位置的进位值相加。

如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个零。

此外,如果链表遍历结束后有 carry>0,还需要在以head为头节点的链表的后面新添一个节点,节点的值为 carry。

代码

class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//同时遍历链表,逐步计算他们的和
//1.变量:n1为链表1的位数的数字,同理n2,carry为进位数
//2.流程:
//1)一开始链表头为null,创建第一个节点,并赋值为两数和
//2)创建一个新节点,并挂上,让指针后移
//3)循环上2)
//4)长链表两数和后,如果最后还有carry,则还需要一个新节点,值为carry
int carry =0; //一开始为0
ListNode head = null;
ListNode end = null;
while(l1!=null||l2!=null){
int n1 = l1!=null?l1.val:0;
int n2 = l2!=null?l2.val:0;
int sum = n1 + n2 +carry;
if(head == null){
//首部,直接赋值
head =end = new ListNode(sum%10);
}else{
//中间,赋值+新节点
end.next = new ListNode(sum%10);//创建新节点并挂上
end = end.next;//end 后移
}
//短链表遍历完后,还需要继续往后遍历长链表的节点
if(l1!=null){
l1 = l1.next;
}
if(l2!=null){
l2 =l2.next;
}
//刷新carry值
carry = sum/10;
//尾部,新节点并赋值,值为carry
if(carry>0){
end.next = new ListNode(carry);//创建新节点并挂上
}
}
return head;//返回以head为头节点的链表
}
}
posted @   gdxstart  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示