牛客Top200---链表相加(java详解)
Posted 小样5411
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客Top200---链表相加(java详解)相关的知识,希望对你有一定的参考价值。
题目
该题和大数加法类似,思路可以借鉴,大数加法
题解
解法1:通过反转链表进行相加
import java.util.*;
public class Solution {
public ListNode addInList (ListNode head1, ListNode head2) {
//解法1:通过反转链表相加
if(head1 == null){
return head2;
}
if(head2 == null){
return head1;
}
ListNode l1 = reverse(head1);//链表反转
ListNode l2 = reverse(head2);
int carry = 0;//进位
ListNode head = new ListNode(-1);//相加后得到链表的head
//carry!=0是为了保证两个整数位数相同最后发生进位,但两个链表head都为空,还有一个进位要算
//如56和72,一开始6+2=8,第二次sum=5+7=12 sum%10=2,carry为进位等于1,就是这个1
while(l1 != null || l2 != null || carry != 0){
int num1 = (l1 == null) ? 0 : l1.val;//两个位数不一样就要补0再加
int num2 = (l2 == null) ? 0 : l2.val;
int sum = num1 + num2 + carry;
carry = sum / 10;
//头插法
ListNode next = head.next;
ListNode node = new ListNode(sum % 10);
head.next = node;//关键两步
node.next = next;
//非空,则两个链表分别向后移动
if(l1 != null){
l1 = l1.next;
}
if(l2 != null){
l2 = l2.next;
}
}
return head.next;
}
//反转链表
private ListNode reverse(ListNode head){
ListNode pre = null;
ListNode cur = head;
while(cur != null){
ListNode next = cur.next;//先记录cur下一个
cur.next = pre;//反向连接
pre = cur;
cur = next;
}
return pre;//返回pre,最后cur=null
}
}
解法2:通过栈
import java.util.*;
public class Solution {
public ListNode addInList (ListNode head1, ListNode head2) {
//解法2:通过栈实现
//声明两个栈,栈1和栈2
Stack<Integer> stack1 = new Stack<>();
Stack<Integer> stack2 = new Stack<>();
//两个链表先入栈
while(head1 != null){
stack1.push(head1.val);
head1 = head1.next;
}
while(head2 != null){
stack2.push(head2.val);
head2 = head2.next;
}
int carry = 0;//进位,初始为0
ListNode head = new ListNode(-1);//用于链接相加后的链表
//进行加法,循环中carry!=0表示如果两个整数的位数相同,可能还需进位算一下,如658和592
//6+5完成后,carry=1,此时stack1和stack2都为空,但是还要将这个1进位放最前面,得到1250
while(!stack1.isEmpty() || !stack2.isEmpty() || carry != 0){
int num1 = stack1.isEmpty()?0:stack1.pop();//可能两个数位数不一样,位数少的不够,已经全部出栈了,但另一个还不为空,这时就要补0
int num2 = stack2.isEmpty()?0:stack2.pop();
int sum = num1+num2+carry;//求和
carry = sum / 10;//记录进位
//头插法,正好会再逆序一下,从而得到目标结果
ListNode next = head.next;//头插先保留head
ListNode cur = new ListNode(sum % 10);
head.next = cur;//最主要两步
cur.next = next;
}
return head.next;
}
}
头插法
以上是关于牛客Top200---链表相加(java详解)的主要内容,如果未能解决你的问题,请参考以下文章