题目:
思路:
要注意到是逆序存储,否则会将问题复杂化。
1.定义一个结点,用于存储结果单链表。其中定义一个指针ptr,方便该链表进行元素的添加。
2.考虑特殊情况,长度不相等,l1或l2为空。
(1)carry(进位)+不为空的值==0,则将0存入结果链表,并且carry=1;
(2)carry+不为空的链表的值<0;j将该值直接存入结果链表。
不为空的链表指针前移,重复以上步骤,直到链表遍历结束
3.一般情况,长度相等。
(1)相同位置两个结点加上carry的和大于等于10,则将该值-10后存入结果链表,carry=1;
(2)相同位置两个结点加上carry的和小于10,则将该值后存入结果链表。并且carry=0;
两链表指针后移,重复以上步骤,直到链表遍历结束。
注意:跳出循环后还要关注carry是否为1,如果是,则将1存入结果单链表。
ListNode result=new ListNode(0);
ListNode ptr=result;
int carry=0;
while(l1!=null&&l2!=null)
{
if(l1.val+l2.val+carry>=10)
{
ListNode p=new ListNode(l1.val+l2.val+carry-10);
ptr.next=p;
ptr=p;
carry=1;
}
else
{
ListNode p=new ListNode(carry+l1.val+l2.val);
ptr.next=p;
ptr=p;
carry=0;
}
l1=l1.next;
l2=l2.next;
}
while(l1!=null&&l2==null)
{
if(carry+l1.val==10)
{
ListNode p=new ListNode(0);
ptr.next=p;
ptr=p;
carry=1;
}
else
{
ListNode p=new ListNode(carry+l1.val);
ptr.next=p;
ptr=p;
carry=0;
}
l1=l1.next;
}
while(l2!=null&&l1==null)
{
if(carry+l2.val==10)
{
ListNode p=new ListNode(0);
ptr.next=p;
ptr=p;
carry=1;
}
else
{
ListNode p=new ListNode(carry+l2.val);
ptr.next=p;
ptr=p;
carry=0;
}
l2=l2.next;
}
if(carry==1)
{
ListNode p=new ListNode(1);
ptr.next=p;
}
return result.next;