【算法】【线性表】【链表】链表求和
1 题目
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912
2 解答
感觉写的有点啰嗦了:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { // write your code here // 如果 l1 为空直接返回l2 if (l1 == null) { return l2; } // 如果 l2 为空直接返回l1 if (l2 == null) { return l1; } // 两者都不为空,先默认返回 l1 ListNode result = l1; // resIndex 始终指向 l1 的最后一个节点 ListNode resIndex = l1; int carry = 0; while (l1 != null && l2 != null) { int num = l1.val + l2.val + carry; if (num > 9) { carry = 1; l1.val = num - 10; } else { carry = 0; l1.val = num; } // 向后移动 resIndex = l1; l1 = l1.next; l2 = l2.next; } // 到这里说明 l1 l2 至少有一个为空了 // 剩下的就是需要把那条不为空的接上来 while (l2 != null) { int num = l2.val + carry; if (resIndex.next == null) { resIndex.next = new ListNode(0); } if (num > 9) { carry = 1; resIndex.next.val = num - 10; } else { carry = 0; resIndex.next.val = num; } resIndex = resIndex.next; l2 = l2.next; } while (l1 != null) { int num = l1.val + carry; if (num > 9) { carry = 1; resIndex.next.val = num - 10; } else { carry = 0; resIndex.next.val = num; } resIndex = resIndex.next; l1 = l1.next; } // 不需要进位 直接返回result 就是 l1 if (carry <= 0) { return result; } // 需要进位 if (resIndex.next == null) { resIndex.next = new ListNode(1); } return result; } }
稍后我想想怎么优化,加油。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了