题解 | #链表相加(二)#
链表相加(二)
https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b
方法1、借助辅助队列和栈
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * } */ public class Solution { /** * * @param head1 ListNode类 * @param head2 ListNode类 * @return ListNode类 */ //思路:设置2个栈,分别存放加数链表1、2 //再设置一个队列,存放sum链表 //每次各出栈一个,相加求和 public ListNode addInList (ListNode head1, ListNode head2) { // write code here Stack<ListNode>add1=new Stack <>(); Stack<ListNode>add2=new Stack <>(); Queue<ListNode>sum1=new LinkedList <>(); //Stack<ListNode>stack if(head1==null)return head2; if(head2==null)return head1; while(head1!=null){ add1.push(head1); head1=head1.next; } while(head2!=null){ add2.push(head2); head2=head2.next; } boolean carry=false; int add1v=0,add2v=0,sum=0; ListNode add1n=null,add2n=null; //结束条件:两个队列都为空,如果其中一个为空,则当前+0 while(!add1.isEmpty()||!add2.isEmpty()){ if(add1.isEmpty()) add1v=0; else{ add1n=add1.pop(); add1v=add1n.val; } if(add2.isEmpty()) add2v=0; else{ add2n=add2.pop(); add2v=add2n.val; } if(carry) sum=add1v+add2v+1; else sum=add1v+add2v; if(sum>=10){ sum%=10; carry=true; }else carry=false; ListNode sumn=new ListNode(sum); System.out.println(sum); sum1.offer(sumn); } if(carry){ ListNode sumn=new ListNode(1); sum1.offer(sumn); } ListNode next=sum1.poll(); ListNode cur=null; while(!sum1.isEmpty()){ cur=sum1.poll(); cur.next=next; next=cur; } return cur; } }方法2、先翻转链表,再从头开始加(结果插入sum链表中时用头插法)
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * } */ public class Solution { /** * * @param head1 ListNode类 * @param head2 ListNode类 * @return ListNode类 */ //思路:翻转链表,再重新按位相加 public ListNode addInList (ListNode head1, ListNode head2) { if(head1==null)return head2; if(head2==null)return head1; boolean carry=false; int add1v=0,add2v=0,sum=0; head1=reverseList(head1); head2=reverseList(head2); ListNode add1n=head1,add2n=head2,headSum=new ListNode(-1); while(add1n!=null||add2n!=null){ if(add1n==null) add1v=0; else{ add1v=add1n.val; add1n=add1n.next; } if(add2n==null) add2v=0; else{ add2v=add2n.val; add2n=add2n.next; } if(carry) sum=add1v+add2v+1; else sum=add1v+add2v; if(sum>=10){ carry=true; sum%=10; } else{ carry=false; } //头插法 ListNode sumn=new ListNode(sum); sumn.next=headSum.next; headSum.next=sumn; } //最后再判断一次是否有进位 //头插法 if(carry){ ListNode sumn=new ListNode(1); sumn.next=headSum.next; headSum.next=sumn; } return headSum.next; } ListNode reverseList(ListNode head){ if(head==null)return null; ListNode cur=head,pre=null,next=null; while(cur!=null){ next=cur.next; cur.next=pre; pre=cur; cur=next; } return pre; } }