【力扣刷题】第二题:两数相加
力扣第2题:两数相加
首先梳理加法流程:
看作三个链表相加,加数链表L1,被加数链表L2,进位链表LP,结果保存在LF链表中。
为进位链表初始化一个节点,val = 0
为结果链表新建一个节点LF
循环体{
处理L1和L2可能存在的空指针
LF.val = L1.val + L2.val + LP.val
若 LF < 10,为进位链表新建节点,val = 0
若 LF > 10,为进位链表新建节点,val = 1,LF.val = LF.val % 10
将L1,L2,LP,LF向后移动
}当L1或L2的非空时,继续循环,否则跳出
--解答错误
1. 结果链表后移时,需要根据实际情况判断是否新建节点,该题目数据结构,new节点不给val也会默认赋0
2. 跳出循环条件有问题,L1或L2非空继续循环,如果此时存在进位链表节点为1则代表存在进位,也应该继续循环
初版结果:
/** * 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 lf = new ListNode(); ListNode lfHead = lf; ListNode lp = new ListNode(0); do { if (l1 == null) { l1 = new ListNode(0); } if (l2 == null) { l2 = new ListNode(0); } int lfVal = l1.val + l2.val + lp.val; if (lfVal < 10) { lp.next = new ListNode(0); } else { lfVal = lfVal % 10; lp.next = new ListNode(1); } lf.val = lfVal; if (l1.next != null || l2.next != null || lp.next.val == 1) { lf.next = new ListNode(); lf = lf.next; } lp = lp.next; l1 = l1.next; l2 = l2.next; } while (l1 != null || l2 != null || lp.val == 1); return lfHead; } }
--辛辛苦苦改了20分钟,可读性变高了,占用内存反而多了,焯!后面抄一个大佬的答案学一下。
提高可读性的版本:
/** * 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 lf = new ListNode(); ListNode lfHead = lf; ListNode lp = new ListNode(0); //判断是否存在未处理的最高位 while (l1 != null || l2 != null || lp.val == 1) { //处理该位数字 int l1Val = l1 == null? 0: l1.val; int l2Val = l2 == null? 0: l2.val; int lfVal = (l1Val + l2Val + lp.val) % 10; int lpVal = (l1Val + l2Val + lp.val) < 10? 0: 1; lp.next = new ListNode(lpVal); lf.val = lfVal; //加数、被加数、进位链表指针后移 lp = lp.next; l1 = (l1==null)? null: l1.next; l2 = (l2==null)? null: l2.next; //结果链表是否需要挂上新节点 if (l1 != null || l2 != null || lp.val == 1) { lf.next = new ListNode(); lf = lf.next; } } return lfHead; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具