美文网首页@IT·互联网
Leetcode02.05:链表求和

Leetcode02.05:链表求和

作者: 我可能是个假开发 | 来源:发表于2024-02-04 18:31 被阅读0次

一、题目描述

给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:

输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912

输入:(1) + (9 -> 9),即1+99
输出:0 -> 0 -> 1,即100

二、题解

思路:因为链表是按照个位十位百位逆序存储的,所以直接顺序遍历链表,第一个就是个位,接着十位,百位等。两个链表的值相加存储作为一个新节点存储,进位信息单独存到一个变量中,每次都加上这个进位信息。
遍历操作使用两个指针遍历:

  • 一个指针(head)指向一开始的头节点(保存链表)
  • 一个指针(last)指向上一次的节点(依次往后移动)

进位及存储的元素判断:

  • 判断是否有进位:两个节点的和/10 如果是0则没有进位,如果是1则有进位。
  • 如果相加是超过了10(即存在进位信息),那么存储在当前节点的值就是余数: 两个节点的和%10
    image.png
/**
 * 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 head = null;

        //指向上一个节点
        ListNode last = null;

        while (l1 != null || l2 != null){
            int val = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val);
            //该位置上的数
            int cur = val + carry;
            Integer remainder = null;
            if ((cur / 10) > 0) {
                //有进位 余数
                remainder = cur % 10;
            }
            //求和之后的新节点
            ListNode newNode = new ListNode(remainder != null ? remainder : cur);
            if (head == null) {
                //一开始的头节点
                head = newNode;
            } else {
                last.next = newNode;
            }
            last = newNode;
            //存储进位信息 给下一次相加使用
            carry = cur / 10;

            l1 = (l1 == null ? null : l1.next);
            l2 = (l2 == null ? null : l2.next);
        }
        //循环结束了如果carry还有值,说明最后还进了一位,再增加一个节点
        if (carry == 1) {
            last.next = new ListNode(carry, null);
        }
        return head;
    }
}

相关文章

  • 链表 求和

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

  • 2020-08-15 链表求和

    1. 链表求和 反向求和,比较简单,从左到右扫描就可以

  • 数据结构算法相关题(LeetCode相关问题)

    1. 斐波那契数列求和 斐波那契数列(0,1,1,2,3,5 . . .)求和 反转链表(反转链表[https:...

  • 一篇文章搞定面试中的链表题目(java实现)

    废话少说,上链表的数据结构 1.翻转链表 2.判断链表是否有环 3,链表排序 4.链表相加求和 5.得到链表倒数第...

  • 链表算法题集合(java实现)

    链表的数据结构 1.翻转链表 2.判断链表是否有环 3,链表排序 4.链表相加求和 5.得到链表倒数第n个节点 6...

  • 【LeetCode】2. Add Two Numbers

    题意 给定两个非空链表,链表每个结点均为非负整数,对两个链表求和返回链表; 解法 解法很简单,如果不会,可以重拾小...

  • [LintCode] 链表求和(简单)

    两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。...

  • 167. 链表求和

    你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开...

  • LintCode - 链表求和(容易)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 难度:容易 要求: 假定用一个链表表示两个数,其中每个节点仅...

  • OJ:lintcode 链表求和

    你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开...

网友评论

    本文标题:Leetcode02.05:链表求和

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