原题如下:
这道题目是一道链表题,我们对于这种链表类,很显然我们最后输出的是初始节点,所以我们要保留我们的初始头指针,那么我们的第一步一定是把头指针保留一份,然后再让头指针往后进行操作。那么我们进行什么操作呢,很简单,就是把l1和l2的对应内容加起来就行了,那么我们就面临这样几个问题。
第一,加的太“多”了,什么叫加多了呢,就是我们的和超过9了,这样的话显然我们要进行进位,我们进位后的那个数等于什么呢?显然是等于我们的和取余10,那么怎么表示我们后面一个要进位加1呢?我们可以再做一个进位指针,标记为0时表示没有进位,为1时表示已经进位(显然我们这里只能是进1)。那么我们之后的和其实等于l1+l2+进位指针的值,综合起来我们一开始把进位指针设为0,那么我们所有的和都可以为l1+l2+进位指针的值。
第二,加的太“少”了,什么意思呢?就是当l1和l2为空值的时候,我们是拿不到我们的val值的,所以这个时候我们人工设为0.
第三,l1和l2都为null,我们还要进位1,这个时候怎么办呢?显然我们只需要把我们的答案输出链表末尾加上一个1即可。
以下是代码(java)实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode answerpre = new ListNode(0) ;
ListNode answer = answerpre ;
int jinzhi = 0 ;
while(l1 != null || l2 != null){
int x = l1 == null ? 0 : l1.val ;
int y = l2 == null ? 0 : l2.val ;
int ans = x + y + jinzhi ;
jinzhi = ans/10 ;
ans = ans % 10 ;
answer.next = new ListNode(ans) ;
answer = answer.next ;
if(l1 != null){
l1 = l1.next ;
}
if(l2 != null){
l2 = l2.next ;
}
}
if( jinzhi == 1 ){
answer.next = new ListNode(1) ;
answer = answer.next ;
}
return answerpre.next ;
}
}