两数之和
两数之和
前言
用两个链表分别表示两个非负整数,一个节点就是一个数字,用逆序存储数字,并且每个节点只能存储一位数字
/** * 默认已有的链表节点类 * 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为头节点的链表 } }
比任何人都要努力
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)