首页 > 其他分享 >LeetCode 链表两数相加

LeetCode 链表两数相加

时间:2024-08-14 19:26:08浏览次数:13  
标签:ListNode val 相加 next 链表 null current1 LeetCode current2

题目描述

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

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

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

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

  • 每个链表中的节点数在范围 [1, 100]
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

题目解析

上边题目这么多,其实就是两个数用链表倒序表示,然后对应位置相加,如果和大于10,就进位,最终要返回新的链表表示两数之和

思路

可以使用模拟的方法,两个链表对应位置相加,只是特殊场景比较多,此外还涉及到最终场景是否进位,是否需要创建链表对象。

定义指针分别指向链表的第一个元素处,然后依次计算对应位置和的场景。

正常情况,指针指向链表1和2的相同位置,如果指针指向的都非null,那么就先计算和,然后指针1和2都后移,

计算完后移动链表1和2的位置

如果其中一个为null,和的运算也只需要计算不为null的那个,只需要不为null的指针后移

比如

还需要定义两个变量addNum 表示进位的数,没有进位就是0,currentVal,表示当前位置上计算后的值,比如2+3,是5,如果超过10,比如7+6,addNum就是1,currentVal=3

然后就是将表示结果的链表指针,赋值val为currentVal

current1和current2已经后移了

同时这里需要处理好最后一个节点的场景,此时需要注意,current1和current2已经指向了下一个元素了

如果current1和current2指向至少一个不为null,那么说明肯定有下一个和,也就肯定有下一轮的计算

所以,创建一个指针表示结果指向的next,然后将当前指针后移

如果两个都为空,那么还需要根据addNum,区分是否创建下一个元素

addNum=0就不用了说明已经到达了结尾,直接返回即可

addNum!=0,说明还有最后一个元素,需要创建一个节点,然后再返回

/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode() {}
 * ListNode(int val) { this.val = val; }
 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode current1 = l1; //定义指针指向l1
        ListNode current2 = l2;//定义指针指向l1
        ListNode l3 = new ListNode(0, null); //定义指针指向l3
        ListNode l3H = new ListNode(0, l3);//定义虚拟头指向l3
        int addNum = 0;//进位
        while (current1 != null || current2 != null) {//结束条件,两个指针都指向了空
            int he = 0;//对应位置和
            //都不为null
            if (current1 != null && current2 != null) {
                //计算和
                he = current1.val + current2.val + addNum;
                //后移指针
                current1 = current1.next;
                current2 = current2.next;
            } else if (current1 == null && current2 != null) {
                //current1=null;计算和,移动current2
                he = current2.val + addNum;
                current2 = current2.next;
            } else if (current2 == null && current1 != null) {
                //current2=null;计算和,移动current1
                he = current1.val + addNum;
                current1 = current1.next;
            }
            //当前位置值
            int currenVal = 0;
            //和大于=10,记进位1,当前位置值为取模
            if (he >= 10) {
                addNum = 1;
                currenVal = he % 10;
            } else {
                //小于10,进位0,当前值就是和
                addNum = 0;
                currenVal = he;
            }
            l3.val = currenVal;//l3赋值
            //下一个指针指向的都是null,说明已经到了结尾
            if (current1 == null && current2 == null) {
                //进位决定是否需要再添加一个末尾元素,如最后是9+9,还需要再添加一个末尾元素
                if (addNum != 0) {
                    ListNode listNode = new ListNode(addNum, null);
                    l3.next = listNode;
                } else {
                    //没有就直接指向null
                    l3.next = null;

                }
                //已经到了末尾返回即可
                return l3H.next;
            } else {
                //下一个指针指向的至少一个不是null,创建指针,next指向下一个,然后移动l3,进入下一轮循环
                ListNode next = new ListNode(0, null);
                l3.next = next;
                l3 = next;
            }

        }
        return l3H.next;
    }
}

不用虚拟头指针的方法,定义指针变量p,指向l3

/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode() {}
 * ListNode(int val) { this.val = val; }
 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode current1 = l1; //定义指针指向l1
        ListNode current2 = l2;//定义指针指向l1
        ListNode l3 = new ListNode(0, null); //定义指针指向l3
        ListNode p =l3;
        int addNum = 0;//进位
        while (current1 != null || current2 != null) {//结束条件,两个指针都指向了空
            int he = 0;//对应位置和
            //都不为null
            if (current1 != null && current2 != null) {
                //计算和
                he = current1.val + current2.val + addNum;
                //后移指针
                current1 = current1.next;
                current2 = current2.next;
            } else if (current1 == null && current2 != null) {
                //current1=null;计算和,移动current2
                he = current2.val + addNum;
                current2 = current2.next;
            } else if (current2 == null && current1 != null) {
                //current2=null;计算和,移动current1
                he = current1.val + addNum;
                current1 = current1.next;
            }
            //当前位置值
            int currenVal = 0;
            //和大于=10,记进位1,当前位置值为取模
            if (he >= 10) {
                addNum = 1;
                currenVal = he % 10;
            } else {
                //小于10,进位0,当前值就是和
                addNum = 0;
                currenVal = he;
            }
            p.val = currenVal;//l3赋值
            //下一个指针指向的都是null,说明已经到了结尾
            if (current1 == null && current2 == null) {
                //进位决定是否需要再添加一个末尾元素,如最后是9+9,还需要再添加一个末尾元素
                if (addNum != 0) {
                    ListNode listNode = new ListNode(addNum, null);
                    p.next = listNode;
                } else {
                    //没有就直接指向null
                    p.next = null;

                }
                //已经到了末尾返回即可
                return l3;
            } else {
                //下一个指针指向的至少一个不是null,创建指针,next指向下一个,然后移动l3,进入下一轮循环
                ListNode next = new ListNode(0, null);
                p.next = next;
                p = next;
            }

        }
        return l3;
    }
}

标签:ListNode,val,相加,next,链表,null,current1,LeetCode,current2
From: https://blog.csdn.net/lingxiyizhi_ljx/article/details/141124995

相关文章

  • LeetCode216.组合总和lll
    4.组合总和lll(LeetCode216)题目叙述:找出所有相加之和为n的k个数的组合,且满足下列条件:只使用数字1到9每个数字最多使用一次返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。示例1:输入:k=3,n=7输出:[[1,2,4]]解释:1......
  • leetcode面试经典150题- 380. O(1) 时间插入、删除和获取随机元素
     https://leetcode.cn/problems/insert-delete-getrandom-o1/description/?envType=study-plan-v2&envId=top-interview-150gotypeRandomizedSetstruct{isHavemap[int]inttotalintarr[]int}funcConstructor()RandomizedSet{retur......
  • leetcode面试经典150题- 45. 跳跃游戏 II
    https://leetcode.cn/problems/jump-game-ii/description/?envType=study-plan-v2&envId=top-interview-150gopackageleetcode150import"testing"funcTestJump2(t*testing.T){nums:=[]int{5,9,3,2,1,0,2,3,3,1,0,0}res:=j......
  • 【刷力扣】876. 链表的中间结点
    876.链表的中间结点依旧是“力扣新手村”里的题,我的思路只有解法1,然而解法2更妙,学习学习!解法1:单指针法1.经过一次遍历求出链表的长度。2.再次遍历找到链表的中间结点。classSolution{public:ListNode*middleNode(ListNode*head){intsize=0;//记录链......
  • Leetcode 234.回文链表
    给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围[1,105] 内0<=Node.val<=9进阶:你能否用 O(n) 时间复杂......
  • 每日一题:Leetcode-662 二叉树最大宽度
    力扣题目解题思路java代码力扣题目:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。树的 最大宽度 是所有层中最大的 宽度 。每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些......
  • 对链表进行排序
    1publicclassSortLinkedList{//方法:对链表进行排序publicstaticListNodesortList(ListNodehead){//如果链表为空或只有一个节点,直接返回if(head==null||head.next==null){returnhead;}//使用......
  • 合并两个有序链表
    1、publicclassMergeTwoSortedLists{//方法:合并两个有序链表publicstaticListNodemergeTwoLists(ListNodel1,ListNodel2){//创建一个虚拟节点作为合并后链表的头节点ListNodedummy=newListNode(0);ListNodecurrent=du......
  • 数据结构之链表超详解(1)
     一人我饮酒醉醉把佳人成双对两眼是独相随只求他日能双归娇女我轻扶琴燕嬉我紫竹林痴情红颜心甘情愿千里把你寻说红颜我痴情笑曲动我琴声妙轻狂高傲懵懂无知只怪太年少弃江山我忘天下斩断情丝无牵挂千古留名传佳话我两年征战已白发一生征战何人陪谁是谁非谁相随戎马一......
  • LeetCode 1383. Maximum Performance of a Team
    原题链接在这里:https://leetcode.com/problems/maximum-performance-of-a-team/description/题目:Youaregiventwointegers n and k andtwointegerarrays speed and efficiency bothoflength n.Thereare n engineersnumberedfrom 1 to n. speed[i] a......