T2. Add Two Numbers 【Medium】
感觉先看下面的 Example 比较容易理解题目
题目
给你两个非空链表,表示两个非负整数,数字是反向储存的(看例题)。它们的每个节点包含一个数字,把对应的数字加起来,将他们的和存为链表返回。
假定两数除了 0 本身以外都没有 leading zero(查了一下,意思就是没有01,02这样的数)
Example
解决:342+465=807
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
思路
主要思路:
- 设置初始进位位a=0
- 链表三[i] = (链表一[i]+链表二[i]+a)%10
- a = (链表一[i]+链表二[i]+a)/10
- 重复二三两步
补充:
① 当两数长度不一时,需要进行处理,这里我把短的链表持续加 0 节点(相当于把 18+9 当做 18+09 )就行了。具体可以看代码以及里面的注释。
② 当有进位时要进位,若 a=1时要继续循环(例如9+8=17)
代码
这是自己的代码,已经 accepted,欢迎提出更好的解法~
/**
* 给出的ListNode类
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//新建一个 ListNode,其 value 为两个链表第一个数字的和的
ListNode t1=new ListNode((l1.val+l2.val)%10);
ListNode t2=t1;
int a=(l1.val+l2.val)/10;
//!a==0代表了有进位,所以还得循环
while(!(l1.next==null)||!(l2.next==null)||a!=0){
//添加0节点
if(l1.next==null){
l1.next=new ListNode(0);
}
if(l2.next==null){
l2.next=new ListNode(0);
}
//与while对应把链表读完
l1=l1.next;
l2=l2.next;
//把正确的值赋给 t1.next
t1.next=new ListNode((l1.val+l2.val+a)%10);
a=(l1.val+l2.val+a)/10;
//把t1置为 t1=t1.next
t1=t1.next;
}
return t2;
}
}