给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
之前有数字从低位开始的两数相加的链表,所以使用链表反转后再相加的方法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l11 = reverseListNode(l1);
ListNode l21 = reverseListNode(l2);
ListNode ansList = help(l11,l21);
return reverseListNode(ansList);
}
//反转链表
private ListNode reverseListNode(ListNode node){
ListNode preNode = null;
ListNode curNode = node;
while(curNode!=null){
ListNode temNode = curNode.next;
curNode.next = preNode;
preNode = curNode;
curNode = temNode;
}
return preNode;
}
//链表表示的数字是从低位开始时
private ListNode help(ListNode l1,ListNode l2){
ListNode ansNode = new ListNode(0);
ListNode temNode = ansNode;
int num=0;
while(l1!=null||l2!=null){
int num1 = l1!=null?l1.val:0;
int num2 = l2!=null?l2.val:0;
int num3 = num+num1+num2;
num = num3/10;
temNode.next=new ListNode(num3%10);
temNode = temNode.next;
if(l1!=null) l1=l1.next;
if(l2!=null) l2=l2.next;
}
if(num>0){//多出一位
temNode.next=new ListNode(num);
}
return ansNode.next;
}
}
方法二不反转链表,使用栈或者数组都可以,下面是使用栈的方式,主要考虑是栈的特性是先进后出
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//使用栈的特性(后进先出)
Stack<Integer> s1 = new Stack();
Stack<Integer> s2 = new Stack();
while(l1!=null){
s1.push(l1.val);
l1=l1.next;
}
while(l2!=null){
s2.push(l2.val);
l2=l2.next;
}
int num = 0 ;//保存进位
ListNode preNode = null;
while(!s1.isEmpty()||!s2.isEmpty()||num>0){
int sum = num;
sum+=s1.isEmpty()?0:s1.pop();
sum+=s2.isEmpty()?0:s2.pop();
num=sum/10;
ListNode curNode = new ListNode(sum%10);
curNode.next = preNode;
preNode = curNode;
}
return preNode;
}
}