首页 > 其他分享 >leetCode2:两数相加(链表)

leetCode2:两数相加(链表)

时间:2024-09-17 14:23:57浏览次数:7  
标签:head ListNode 相加 链表 tail l2 leetCode2 null

题目:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

思路:

  • 遍历两个链表,逐位相加,还要加上进位
  • 结果要存在链表里,所以一个 head 链表记住链表头, 另一个 tail 链表往后遍历,存储相加的结果

代码:

 public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = null;
        ListNode tail = null;
        int add = 0;

        while (l1!=null || l2!=null) {
            int x =0;
            int y = 0;

            //思路:逐位相加,还要加上进位
            if (l1!=null) {
                x = l1.val;
            }
            if (l2!=null) {
                y = l2.val;
            }
		  //第一个链表的值,加上第二个链表的值,再加上累加值,就是结果
            int sum = x+y+add;

            if (head==null) {
                //head为null, 说明是刚开始遍历。 head 主要是用来记住结果的链表头
                // tail 也要初始化的
                // sum取余10,就是每一位的值
                tail = new ListNode(sum%10);
                head = tail;
            } else {
                //将相加的结果,放到 tail 里面。逐个填入
                tail.next = new ListNode(sum%10);
                //向后遍历
                tail = tail.next;
            }
            // sum除以10,就是要进位的值。
            add = sum/10;

            //两个链表,都要向后遍历
            if (l1!=null) {
                l1 = l1.next;
            }
            if (l2!=null) {
                l2 = l2.next;
            }

        }

        //最后,如果相加还有进位,要新建节点
        if ( add >0) {
            tail.next = new ListNode(add);
        }
        return head;



    }

标签:head,ListNode,相加,链表,tail,l2,leetCode2,null
From: https://www.cnblogs.com/expiator/p/18417145

相关文章

  • Leetcode 19.删除链表的倒数第第N个结点
    1.题目基本信息题目:给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。地址:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/2.解题方法2.1.解题思路使用快慢指针2.2.解题步骤第一步,初始化快指针为head,慢指针指向一个哑结点,哑结点......
  • pta重排链表(一个很清晰的实现,完全模拟链表的实现)
    #include<iostream>#include<iomanip>#include<unordered_map>#include<string>usingnamespacestd;constintN=100010;unordered_map<string,string>neStr;unordered_map<string,int>eStr;stringheadStr;intn;......
  • C# 链表排序之插入排序
    在C#中,对于链表(如LinkedList<T>)进行排序,插入排序是一个可行的选择,尽管它可能不是最高效的排序方法,特别是当链表很长时。插入排序的基本思想是将链表分成已排序和未排序的两部分,初始时,已排序部分只包含链表的第一个元素,然后依次将未排序部分的元素插入到已排序部分的适当位置......
  • 5、循环双链表
    #include<stdio.h>#include<assert.h>#include<malloc.h>typedefintElemType;typedefstructNode{ElemTypedata;structNode*prior;structNode*next;}Node,*PNode;typedefstructDCList{PNodefirst;PNodelast......
  • 力扣热题100 - 二叉树:二叉树展开为链表
    题目描述:题号:114给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。解题思路:思路一:前序遍历后......
  • 链表
    链表可以\(O(1)\)插入/删除单向链表顾名思义只有后继指针邻接表我习惯叫做链式前向星,一般用来存储图,挺好理解的,这里直接给出存图的应用structedge{intto,nxt;}eg[M];inthead[N],egtot;voidadd(intu,intv){eg[++egtot].to=v;eg[eg......
  • 旋转链表
    旋转链表开头:对于链表的建立已经熟悉,那我们现在讲讲旋转链表的如何实现,当然旋转链表的建立是在已经掌握普通链表的基础上讲解。正文:旋转链表,顾名思义就是让链表“动起来”。即:使链表尾部最后的结点转到链表首部的位置。假设已经建立好一条6个结点的链表,它的初始状态如下图:我......
  • C语言:链表
    链表是一种常见的基础数据结构,它由一系列节点(Node)组成。每个节点包含两部分:数据域(存储数据)和指针域(存储下一个节点的地址)。链表的特点是元素在内存中不一定连续存储,而是通过指针连接起来。以下是链表的一些基本特点:动态性:链表的长度可以动态变化,不需要在创建时指定大小。灵活......
  • Day4||24.两两交换链表中的节点|19.删除链表的倒数第n个结点|面试题:链表相交|142.环形
    24.两两交换链表中的节点题目:24.两两交换链表中的节点-力扣(LeetCode)给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。图解思路首先,虚拟头结点挺方便链表进行增删改操作的。本题操作用到三......
  • 链表的快速排序(C/C++实现)
    一、前言大家在做需要排名的项目的时候,需要把各种数据从高到低排序。如果用的快速排序的话,处理数组是十分简单的。因为数组的存储空间的连续的,可以通过下标就可以简单的实现。但如果是链表的话,内存地址是随机分配的,不能像数组那样通过下标就直接实现。所以在这里给大家介绍......