题目
有两个链表,每个链表的结点都是一个数字,并且是倒序排列。求:这两个链表相加后所得到的链表(与原始链表同样方式)
例如:
我的思路
- 思路一:将每个链表转化为数字,相加得到结果,然后再转换为数字。
- 思路二:以结点为单位,两个链表对应结点相加。所得结果/10然后加上前一个结点/10所得的商生成结果结点。
- 思路三:以结点为单位,两个链表对应结点相加得到一个新的链表,再对这个链表进行处理:判断是否每个结点的值都大于等于10?如果是,那么就将这个值改为val%10,并将下一个结点的值+1
/**
* 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 head=new ListNode();
ListNode temp=head;
while(l1!=null && l2!=null){
temp.next=new ListNode(l1.val+l2.val);
temp=temp.next;
l1=l1.next;
l2=l2.next;
}
while(l1!=null){
temp.next=l1;
temp=temp.next;
l1=l1.next;
}
while(l2!=null){
temp.next=l2;
temp=temp.next;
l2=l2.next;
}
temp=head.next;
while(temp!=null){
if(temp.val>=10){
//return new ListNode(temp.val);
if(temp.next!=null){
temp.next.val++;
}else{
temp.next=new ListNode(temp.val/10);
}
temp.val=temp.val%10;
}
temp=temp.next;
}
return head.next;
}
}
官方题解
/**
* 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 head=null,temp=null;
int carry=0;//进位值
while(l1!=null||l2!=null){
int val1=l1==null?0:l1.val;
int val2=l2==null?0:l2.val;
int sum=val1+val2+carry;
if(head==null){
head=temp=new ListNode(sum%10);
}else{
temp.next=new ListNode(sum%10);
temp=temp.next;
}
carry=sum/10;
if(l1!=null){
l1=l1.next;
}
if(l2!=null){
l2=l2.next;
}
}
if(carry>0){
temp.next=new ListNode(carry);
}
return head;
}
}