leetcode解题之两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 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;
    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值