菜鸟上路之leetcode链表题---by JAVA

本文介绍了一种解决链表加法问题的方法,通过使用双端队列(Deque)作为栈来存储链表元素,实现了高位在前的链表数值相加。详细解释了如何利用栈的特性进行加法运算并处理进位,最后反转结果输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题:
给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。

进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

想法:正常加法是以个位开始,如果列表中的节点不能反转,想要首先实现各位的加法运算,用栈比较方便;相应的空间占用会大一些;

第一步:实例化两个栈或者双端队列,用来存储给定列表,并将列表中的值压栈
第二步:对两个栈中的元素进行加操作,别忘了进位;
第三步:因为得到的元素各位百位是顺序颠倒的,因此将结果压栈,在出栈输出为链表返回;
/**
 * 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) {
        Deque<Integer> deque1 = new LinkedList<>();						//用来装第一个链表中的元素
        Deque<Integer> deque2 = new LinkedList<>();						//用来装第二个链表中的元素
        Deque<Integer> deque3 = new LinkedList<>();						//后面用来反转链的顺序
        ListNode p = l1, q = l2;										//头节点指针
        while(p != null){												//将第一个链表压栈
            deque1.push(p.val);
            p = p.next;
        }
        while(q != null){												//将第二个链表压栈
            deque2.push(q.val);
            q = q.next;
        }
        
        int carry = 0;													//初始化进位
        while(deque1.size() != 0 || deque2.size() != 0){						
            int x = (deque1.size() != 0) ? deque1.poll() : 0;			//栈一元素出栈
            int y = (deque2.size() != 0) ? deque2.poll() : 0;			//栈二元素出栈
            int sums = x + y + carry;
            carry = sums/10;											//进位
            deque3.push(sums%10);										//数和直接压栈,栈三
        }
        if(carry != 0){													//判断最高位相加是否进位
            deque3.push(carry);
        }     
        ListNode node = new ListNode(0);
        ListNode temp = node;
        while(deque3.size() != 0){										//反转链表顺序
            temp.next = new ListNode(deque3.poll());
            temp = temp.next;
        }
        return  node.next;
    }
}

总结:
1、这道题用了双端队列Deque接口,该接口也可以实现“先进后出”,用Stack类也可以;
2、最开始 Deque deque1 而非 Deque deque1 ,前面的做法其实也可以,但是时间过 不去,而且比较占空间;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值