题目链接:https://leetcode-cn.com/problems/add-two-numbers-ii/
题目如下:
思路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) {
//思路1、反转链表,相加,反转链表
//思路2、开栈 (这个程序使用思路2)
Stack<Integer> num1=new Stack<Integer>();
Stack<Integer> num2=new Stack<Integer>();
while(l1!=null){
num1.push(l1.val);
l1=l1.next;
}
while(l2!=null){
num2.push(l2.val);
l2=l2.next;
}
ListNode result=new ListNode(-1);//待返回的结果链表
int carry=0;//进位
while(num1.empty()==false&&num2.empty()==false){
int p1=num1.pop();
int p2=num2.pop();
//惯用相加代码
int cur=p1+p2+carry;
if(cur>=10) {
carry=cur/10;
cur=cur%10;
}
else carry=0;
//
//惯用在链头增加节点
ListNode p=new ListNode(cur);//每次添加链表节点到末尾
p.next=result.next;
result.next=p;
//
}
while(num1.empty()==false){
int p1=num1.pop();
int cur=carry+p1;
if(cur>=10) {carry=cur/10;cur=cur%10;}
else carry=0;
ListNode p=new ListNode(cur);
p.next=result.next;
result.next=p;
}
while(num2.empty()==false){
int p1=num2.pop();
int cur=carry+p1;
if(cur>=10) {carry=cur/10;cur=cur%10;}
else carry=0;
ListNode p=new ListNode(cur);//每次添加链表节点到末尾
p.next=result.next;
result.next=p;
}
if(carry==1) {
ListNode p=new ListNode(1);//每次添加链表节点到末尾
p.next=result.next;
result.next=p;
}
return result.next;
}
}
思路2:(new+important+反转链表大宝帮助)
/**
* 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 {
//思路1、反转链表,相加,反转链表 (这个程序使用思路1)
//思路2、开栈
public ListNode reverselist(ListNode head){//反转链表
//原始:a->b->c
ListNode a=head,b=head.next;
while(b!=null){
ListNode c=b.next;
b.next=a; //操作后:a->b->a
a=b; //操作后:b->a
b=c; //操作后:c->b->a
}
head.next=null;//head即a,操作后:c->b->a->null
return a;
}
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
l1=reverselist(l1);
l2=reverselist(l2);
ListNode result=new ListNode(-1);
int cur=0;
while(l1!=null||l2!=null||cur!=0){
if(l1!=null) {cur+=l1.val;l1=l1.next;}
if(l2!=null) {cur+=l2.val;l2=l2.next;}
ListNode p=new ListNode(cur%10);//每次再链头放入节点
p.next=result.next;
result.next=p;
cur=cur/10;
}
return result.next;
}
}