链表练习——两数求和
先看题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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)链表中的数字是逆序存储的
比如321,他的链表结构是 1 ——> 2 ——> 3。456,他的链表结构是 6 ——> 5 ——> 4。
在计算时我们遍历两个链表的第一位是数字的个位:
首先我们要返回一个链表,先定义一个头节点,用来初始化链表,定义一个进制位变量用来存储需要进位的数字(要在遍历两条链表之前定义,因为两个链表的最后一个节点之和要进位时需要在建立一个尾节点)。然后遍历两个链表,首先我们先思考一下两条链表怎么相加,就是每一个节点的val值相加,前提是个十百千....位都要对齐做运算。如果一个数是321,另一个数是12,那么运算过程是
1 + 1, 2 + 2, 3 + 0。所以我们是要遍历完两个链表的,虽然链表的长度可能不一致,但是当一条链表长度不够(也就是节点为null),我们需要将这个节点的val设为 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 pre = new ListNode(); ListNode cur = pre; int jinwei = 0; while(l1 != null || l2 != null) { int val1 = l1 == null ? 0 : l1.val; int val2 = l2 == null ? 0 : l2.val; int sum = val1 + val2 + jinwei; jinwei = sum / 10; sum = sum % 10; cur.next = new ListNode(sum); cur = cur.next; if(l1 != null) l1 = l1.next; if(l2 != null) l2 = l2.next; } if(jinwei == 1){ cur.next = new ListNode(jinwei); } return pre.next; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix