美文网首页
2.链表求两数之和

2.链表求两数之和

作者: 夜空中最亮的星_6c64 | 来源:发表于2018-12-03 11:38 被阅读0次

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

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

解答:

单链表:ListNode

时间复杂度:O(max(m, n)),假设 m 和 n 分别表示 l1 和 l2 的长度,上面的算法最多重复 max(m,n) 次;空间复杂度:O(max(m, n)), 新列表的长度最多为 max(m,n)+1
1.1 首先声明ListNode这个类

public class ListNode {
    public int val;
    public ListNode next;
    public ListNode(int x) {
        val = x;
    }
}

1.2 接着,操作链表不断求和

public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // l1或者l2为空时,直接返回另一者。
        if (l1 == null) {
            return l2;
        }
        if (l2 == null) {
            return l1;
        }
        /*
         * 最开始:rs和out共用一个地址, 过程:不断操作rs,rs每次都是一个新的结点。在修改链表时,只修改rs这条链,
         * 最终:将链表结果传给out,out返回head则自动返回所有。 如果不声明rs,直接不断改变out,结果将不会返回一长链。
         */
        ListNode out = new ListNode(0);
        // 初始化时,l1和l2的头结点分别赋值给p,q。后期不断修改rs
        ListNode p = l1, q = l2, rs = out;
        // 进位 该位上和
        int carry = 0, sum = 0;
        while (p != null || q != null) {
            // l1和l2长度不一时,遍历p和q,可以使用三元运算符返回各自的x和y。
            int x = (p != null) ? p.val : 0;
            int y = (q != null) ? q.val : 0;
            sum = x + y + carry;
            if (sum < 10) {
                //  8时,没有进位,不加0的话carry被认为1
                carry = 0;
                // rs存储值
                rs.next = new ListNode(sum % 10);
                rs = rs.next;
            } else {
                // 进位最多为1,9+9+1=19
                carry = 1;
                rs.next = new ListNode(sum % 10);
                rs = rs.next;
            }
            // 继续下一个,一个节点存储一位数字。
            if (p != null) {
                p = p.next;
            }
            if (q != null) {
                q = q.next;
            }
        }
        // 运行到最高位时,如果有进位,需要在加一个节点
        if (carry > 0)
            rs.next = new ListNode(carry);
        return out.next;
    }

知识点:

存储结构如图:



链表结构:
data+next

相关文章

  • leetcode top100

    1.求两数之和(数组无序) 2.求电话号码的字母组合 3.三数之和 4.两数之和(链表)

  • 2.链表求两数之和

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只...

  • algrithrom

    求和问题,双指针解决 done 两数之和 三数之和 最接近三数之和 四数之和 链表反转问题 done 链表反转 链...

  • 2.两数之和

    使用两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一...

  • LeetCode 第18题:四数之和

    1、前言 2、思路 采用三数之和的思路,原本三数之和可以分解为:数组中的一个数 + 此数右边的数求两数之和,那么四...

  • week 2019-07-14

    四数之和 括号生成 合并K个链表

  • 2.两数相加

    数字以链表的方式逆序存储,要求计算两数之和并放置于链表中。 思路:利用while循环,检测两数是否为空,当非空的时...

  • 鸡兔同笼问题之延伸

    2.鸡兔互换问题(已知总脚数及鸡兔互换后总脚数,求鸡兔各多少的问题), 〔(两次总脚数之和)÷(每只鸡兔脚数和)+...

  • 腾讯优图常见算法题

    最常见的: 一、 两数之和 二、链表反转 三、环状链表 四、快排 五、合并两个有序链表 六、最大子序和 七、最长上...

  • LeetCode

    1.两数之和 2.两数相加ps:不能直接求总和,再一位一位赋值,因为总和会超过long long的位数限制 3.无...

网友评论

      本文标题:2.链表求两数之和

      本文链接:https://www.haomeiwen.com/subject/kgtycqtx.html