两数相加
题目:
- 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题思路:数字是放在链表中的,进行加运算,用两个指针就可以解决,指针同时后移,将指针对应数字加起来即可。这里有个小问题,进位,满10进1,这里再设一个变量carry存放进位数字,在每次进行加运算时,再加上进位。
还有一个小问题,两个数,即链表长度不一样,一个结束了,另一个还有数字未加,按通常的逻辑,剩余就是剩余数字加0,所以用一个三目运算符判断一下当前数字是否为空,为空指针数字为0,不为空还是原来的数字。
![](https://i-blog.csdnimg.cn/blog_migrate/439d8ae5006ea2114b2fbe747db0b1ea.png)
代码实现:
/**
* 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 head=new ListNode(0); //创建一个虚拟头结点
ListNode rear=head; //尾指针
int carry=0; //进位
while(true){
if(l1==null&&l2==null&&carry==0){
break;
}
int num=(l1==null?0:l1.val)+(l2==null?0:l2.val)+carry;
ListNode n=new ListNode(num%10); //创建结点,用来放num的值
rear.next=n; //尾插法
rear=n;
carry=num/10; //更新carry的值
l1=l1==null?null:l1.next; //移动指针
l2=l2==null?null:l2.next;
}
return head.next;
}
}