题目:
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?示例:
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-lists-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
因为头节点到尾节点依次是从个位、十位、百位。。。 所以我们只需要让两个链表直接挨个遍历相加,如个位相加的得数取模10,将得到的数存到新链表,这个数就是两个链表数相加后的个位数,以此类推个位,十位,,,皆是如此,最终得到的链表就是两个链表相加后的结果。
原理就像小学的加法算数,两数相加,逢十进一,余下的数当前进位即可;
/**
* 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) {
//排除一些极端情况
if(l1 == null){
return l2;
}
if(l2 == null){
return l1;
}
//表示进位
int carray = 0;
ListNode head = new ListNode(0);
ListNode pre = head;
while(l1 != null || l2 != null || carray != 0) {
//两链表求和的值,初始化,上一个相加的进位
int sum = carray;
if(l1 != null) {
sum += l1.val;
//l1节点向后移动
l1 = l1.next;
}
if(l2 != null) {
sum += l2.val;
//l2节点向后移动
l2 = l2.next;
}
//构建一个新节点,把将pre的指向新节点
pre.next = new ListNode(sum%10);
//pre的节点向后移动
pre = pre.next;
//两链表l1,l2数相加后的进位数
carray = sum/10;
}
return head.next;
}
}