示例如下图:
解题分析:
链表长度:
- l1>l2
- l1=l2
- l1<l2
结果链表:最后一个结点得到的值<10,结果链表的长度为l1和l2中的较大者;最后一个结点的到的值>=10;结果链表的长度为l1和l2中的较大者加1(进位)。
实现代码如下:
class Solution {
public static int count=0;
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//head1>=head2
ListNode head1=getLength(l1)>=getLength(l2)?l1:l2;
ListNode head2=getLength(l1)>=getLength(l2)?l2:l1;
//结果为长链表或长链表加一
ListNode result=head1;
ListNode RESULT=result;
while(head1!=null||head2!=null){
//head1 head2都不为空
if(head1!=null&&head2!=null){
//相加结果<10
if((head1.val+head2.val+count)<10){
result.val=head1.val+head2.val+count;
result=result.next;
head1=head1.next;
head2=head2.next;
count=0; }
//结果>=10
else if((head1.val+head2.val+count)>=10){
//不是最后一个结点
if(result.next!=null){
result.val=(head1.val+head2.val+count)%10;
result=result.next;
head1=head1.next;
head2=head2.next;
count=1; }
//结果>=10 且是最后一个结点
else if(result.next==null){
result.val=(head1.val+head2.val+count)%10;
result.next=new ListNode(1,null);
count=0;
break;
}
}
}
//head2为空,head1不为空
else if(head2==null&&head1!=null){
//结果<10
if(head1.val+count<10){result.val=head1.val+count;
result=result.next;
head1=head1.next;
count=0;}
//结果>=10
else if(head1.val+count>=10){
//不是最后一个结点
if(result.next!=null){
result.val=(head1.val+count)%10;
result=result.next;
head1=head1.next;
count=1;}
//结果>=10 且是最后一个结点
else if(result.next==null){
result.val=(head1.val+count)%10;
result.next=new ListNode(1,null);
count=0;
break;
}
} } }
return RESULT;
}
//获取链表长度
public static int getLength(ListNode l){
ListNode current=l;
int size=0;
while(current!=null){
current=current.next;
size++;
}
return size;
}
}
具体实现步骤:首先定义一个获取链表长度的函数,调用该函数获取两个链表长度较大者,新建结点head1指向较大链表用于遍历;新建一个结点result=head1用于存放结果,并新建一个结点RESULT=result用于最后的返回结果,定义一个全局变量count用于存储进位.
第二步,当任意一个链表不为空时循环遍历,其中又分为两种情况:1.head1和head2都不为空;2.head2为空,head1不为空。(head1已经定义为较大者)
第三步,在第二步种每一种条件内判判断head1.val+head2.val+count的值,<10,当前结点的值就等于head1.val+head2.val+count,此时进位为0,直接遍历;>=10,需要判断是否为最后一个结点,如果是最后一个结点,新建一个值为1的结点添加到结果链表的末端,并结束当前循环(break:),如果不是最后一个结点,该结点的值为(head1.val+head2.val+count)%10,且设置进位为1,遍历直到最后一个结点。
循环逻辑:
运行结果: