题解 | #连续子数组的最大和#

链表相加(二)

http://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b

import java.util.Stack;

/*
 * 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) {
        // write code here
        if (null == head1 && null == head2) {
            return null;
        }
        if (null == head1) {
            return head2;
        }
        if (null == head2) {
            return head1;
        }
        // 具体代码实现
        // 将两个链表进行反转
        head1 = reverseList(head1);
        head2 = reverseList(head2);
        // 定义两个指针,初始时分别指向两个链表的头节点
        ListNode ln1 = head1;
        ListNode ln2 = head2;
        // 定义一个整型变量,用于存放进位
        int an = 0;
        // 定义一个整型变量,用于存放余数
        int val = 0;
        // 定义一个用于临时存储数据的整型变量
        int ts = 0;
        // 定义一个栈,用于存放最终的结果
        Stack<ListNode> result = new Stack<>();
        
        while (null != ln1 && null != ln2) {
            ts = ln1.val + ln2.val + an;
            val = ts % 10; // 余数
            an = ts / 10; // 进位
            // 这里不要贪心,还是老老实实新建一个节点吧
            result.push(new ListNode(val));
            // 指针后移一位
            ln1 = ln1.next;
            ln2 = ln2.next;
        }
        // 定义另一个指针
        ListNode ln = null != ln1 ? ln1 : (null != ln2 ? ln2 : null);
        if (null == ln) {
            // 如果都为空
            if (0 != an) {
                result.push(new ListNode(1));
            }
        }
        else {
            // 如果有一个不为空,将剩下的节点压栈
            while (null != ln) {
                ts = ln.val + an;
                val = ts % 10; // 余数
                an = ts / 10; // 进位
                result.push(new ListNode(val));
                ln = ln.next;
            }
            if (0 != an) {
                result.push(new ListNode(1));
            }
        }
        // 最终,将栈里面的节点依次弹出,就是我们想要的最终结果
        head1 = result.pop();
        ln1 = head1;
        while (!result.isEmpty()) {
            ln1.next = result.pop();
            ln1 = ln1.next;
        }
        return head1;
    }
    
    // 反转链表
    public static ListNode reverseList(ListNode head) {
        if (null == head) {
            return null;
        }
        if (null == head.next) {
            return head;
        }
        // 定义一个辅助栈
        Stack<ListNode> stack = new Stack<>();
        // 定义一个指针
        ListNode ln = head;
        // 具体代码实现
        while (null != ln) {
            stack.push(ln);
            ln = ln.next;
        }
        head = stack.pop();
        ln = head;
        while (!stack.isEmpty()) {
            ln.next = stack.pop();
            ln = ln.next;
        }
        // 别忘了,末尾置为null
        ln.next = null;
        // 返回头节点
        return head;
    }
}
全部评论

相关推荐

巧克力1:双选会不如教室宣讲会
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
440737次浏览 4493人参与
# 春招别灰心,我们一人来一句鼓励 #
41503次浏览 524人参与
# 北方华创开奖 #
107313次浏览 599人参与
# 地方国企笔面经互助 #
7928次浏览 18人参与
# 同bg的你秋招战况如何? #
75684次浏览 552人参与
# 虾皮求职进展汇总 #
114355次浏览 884人参与
# 阿里云管培生offer #
119880次浏览 2219人参与
# 实习,投递多份简历没人回复怎么办 #
2454094次浏览 34848人参与
# 实习必须要去大厂吗? #
55687次浏览 960人参与
# 提前批简历挂麻了怎么办 #
149836次浏览 1977人参与
# 投递实习岗位前的准备 #
1195731次浏览 18546人参与
# 你投递的公司有几家约面了? #
33180次浏览 188人参与
# 双非本科求职如何逆袭 #
661934次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4734次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157604次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11381次浏览 271人参与
# 发工资后,你做的第一件事是什么 #
12431次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35621次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20091次浏览 240人参与
# 我的上岸简历长这样 #
451933次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39241次浏览 314人参与
# 非技术岗是怎么找实习的 #
155852次浏览 2120人参与
牛客网
牛客企业服务