一、题目表述
给定两个代表非负数的链表,数字在链表中是反向存储的(链表头结点处的数字是个位数,第二个结点上的数字是十位数…),求这个两个数的和,结果也用链表表示。
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.二、思路分析
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
- 本题考查基本的链表操作(链表遍历)
- 个位数加法特征,两个个位数相加最大是18,也就是对应位相加时最多产生进位1。
- 最后进位问题最后一个进位需要添加节点。
/**
* 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) {
ListNode l3 = null;
//结果链表
ListNode l11 = l1;
ListNode l22 = l2;
while(true){
if(l11 == null){
l3 = l2;
break;
}
if(l22 == null){
l3 = l1;
break;
}
int sum = l11.val + l22.val;
l11.val = sum;
l22.val = sum;
l11 = l11.next;
l22 = l22.next;
}
//由于两个个位数相加最大是18,所以只需要一次进位即可
ListNode l33 = l3;
int carry = 0;
//进位默认为0
while(true){
l33.val += carry;
if(l33.val > 9){
l33.val -= 10;
carry = 1;
}else{
carry = 0;
}
if(l33.next == null){
if(carry == 1){//最后一位还需要进位
ListNode head = new ListNode(1);
l33.next = head;
}
break;
}else{
l33 = l33.next;
}
}return l3;
}
}
四、测试连接 【java学习|【算法学习】链表数相加(Java)】牛客网
力扣
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)