• 2#两数相加


    题目描述

    2#两数相加

    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

    你可以假设除了数字 0 之外,这两个数字都不会以零开头。

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807
    

    分析

    由于是两个链表的元素对应相加,很自然地就想到用双指针,然后在双指针的基础上加一些进位的操作满足特殊情况。

    1. 结果位数与有原链表相等

    这是一种比较简单的情况,原题中的测试用例就是这种。虽然在中间的某一位会有进位,但是最高位之和比较小,不会产生进位,最后的和的结果的位数也和两个加数中较长的那个一致。

    Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
    Output: 7 -> 0 -> 8
    Explanation: 342 + 465 = 807.
    

    这种情况的处理就比较简单。新建一个链表,设置一个int型的变量carry来保存进位的信息,使用两个指针分别遍历两个链表,取出每一位的值(细节:如果指针变为null了,取出的值为0),依次在链表的尾部添加每一位的结果。

    2. 结果位数与原链表不等

    这种情况,最高位比较大,最后的结果会比两个加数中较大的那个还多一位。

    Input: (9 -> 9) + (1)
    Output: 0 -> 0 -> 1
    Explanation: 99 + 1 = 100.
    

    在这种情况下,最后要多一步操作,判断carry位是否为0,如果不为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) {
            int carry = 0;
            ListNode result = new ListNode(0);
            ListNode current = result;
            while (l1 != null || l2 != null){
                int x = (l1 != null)? l1.val : 0;  // 取出对应位的值
                int y = (l2 != null)? l2.val : 0;
                int sum = x + y + carry;
                current.next = new ListNode(sum % 10);
                carry = sum / 10;            // 计算进位
                if (l1 != null) l1 = l1.next;
                if (l2 != null) l2 = l2.next;
                current = current.next;
    
            }
            if (carry > 0) // 判断是否需要多加一位
                current.next = new ListNode(carry);
            
            return result.next;
            
        }
    }
    
  • 相关阅读:
    IP地址分类整理
    PHP
    [转载]数组的全排列问题
    使用 Homebrew 安装 Git
    Homebrew简介及安装
    iOS开发~CocoaPods使用详细说明
    关于目前自己iOS项目使用的第三方开源库
    IOS 时间格式 时间转换 大总结
    Xcode磁盘空间大清理
    Swift百万线程攻破单例(Singleton)模式
  • 原文地址:https://www.cnblogs.com/yuzhenzero/p/9626415.html
Copyright © 2020-2023  润新知