题目要求:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题目分析,要求数字相加求和
思路一:第一印象便是将每个链表所表示的数字提取出来,求和后在重新存储在链表中,但在这一过程中,会在链表与数字的转化过程中产生大量的开销,所以放弃这种思路
思路二:题目所给的链表是逆序排列,并且要返回一个逆序存储链表。这与人们计算加法时的思路是一样的,逆序相加。将此思路画图得:
考虑情况:
每次循环都要考虑进位
对表尾为null的处理
代码实现:
/**
* 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) {
//进位
int upNum = 0;
ListNode resultList = new ListNode(0);
//创建指向表头的指针
ListNode result = resultList;
//循环边界:两加数的最高位计算完毕,且没有进位
while(l1!=null||l2!=null||upNum!=0){
int num;
if(l1 == null&& l2 == null){//两加数高位计算完毕,有进位
num = upNum;
}else if(l1 == null){//加数1最高位计算完毕
num = l2.val+upNum;
l2 = l2.next;
}else if(l2 == null){//加数2最高位计算完毕
num = l1.val+upNum;
l1 = l1.next;
}else{
num = l1.val+l2.val+upNum;
l1 = l1.next;
l2 = l2.next;
}
upNum = num/10;
resultList.val = num%10;
//进位条件,加数仍未到最高位或进位不为零
if(l1 != null|| l2 != null||upNum!=0){
resultList.next = new ListNode(0);
resultList = resultList.next;
}
}
return result;
}
}
算法思路不变,对代码优化:
利用 三元运算符,减少大量的 if-else 语句,使代码简介明了
package com.hby.exercise01;/*
* 作用:leetCokde 2.两数相加
*
*@author hby_gd@163.com
*@date 18/7/2020 下午3:02
*/
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int upNum = 0;
ListNode resultList = new ListNode(0);
ListNode result = resultList;
while(l1!=null||l2!=null){
int num;
int x;
int y;
x= (l1 == null?0:l1.val);
y= (l2 == null?0:l2.val);
num = x+y+upNum;
if(l1!=null){
l1= l1.next;
}
if(l2!=null){
l2= l2.next;
}
upNum = num/10;
resultList.next = new ListNode(num%10);
resultList = resultList.next;
}
//考虑循环结束,仍有进位未处理的情况
if(upNum!=0){
resultList.next = new ListNode(upNum);
}
return result.next;
}
}
总结:题目难度一般,重点考察了对加法的理解,以及链表的相关操作