hot100第二题 两数相加
**
题目描述:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题目分析
首先明确两个链表按逆序存储的方式实质上是减小了这道题的难度,逆序存储的进位就是它的下一位,而正序存储的话,进位是他的上一位,这在单向链表中很难实现往上进;其次看到题目时,首先考虑的是按位求和,然后再做进位运算;最后分析可能出现的情况:l1>=l2,l2>l1,末位需进位。代码实现是以l1为基准实现两数相加,最后返回l1.
代码如下(示例):
/**
* 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 head1=l1;
ListNode head2=l2;
while(head1!=null){
if(head2!=null){
head1.val+=head2.val;
head2=head2.next;//遍历下一个
}
if(head1.val>=10){
head1.val=head1.val%10;
if(head1.next==null){
head1.next=new ListNode(0);//如果没有下一位,创建出一个新的,继续加一
}
head1.next.val+=1;
}
if(head1.next==null && head2!=null){//l1到头了 而l2还有 直接将l2后面的加到l1
head1.next=head2;
break;
}
head1=head1.next;//遍历下一个
}
return l1;//返回链表
}
}