1. 题目
描述
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
数据范围:0≤n,m≤10000000 ,链表任意值 0≤val≤9 要求:空间复杂度 O(n),时间复杂度 O(n))
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
示例1
输入:
[9,3,7],[6,3]
返回值:
{1,0,0,0}
示例2
输入:
[0],[6,3]
返回值:
{6,3}
2. 解题思路
对于给定的两个链表相加,首先是最后两个节点值的相加,接下来是倒数第二节点值的相加,从后向前执行节点值的相加。即:节点7与节点3相加,再执行节点3与节点6相加(还需加上进位数),最后是节点9与进位数的相加。
也就是说链表的遍历是从后向前的,因此需要先对链表进行反转,再进行节点值的相加操作,最后再对新生成的链表反转。
具体步骤如下:
第一步:反转链表。
对两个链表指向反转操作(如果对链表反转不太熟悉,可以参考前面的文章:《可视化图解算法:反转链表》)。
第二步:执行链表节点值相加操作。
在此过程中需要先定义一个虚拟头节点与进位的变量。
节点3与节点6相加,注意进位值carry=1:
h2指向为Null,新链表的节点为:h1指向的值+carry(进位值):
当h2与h1都指向Null时,需要判断进位值carry是否为0,如果不为0,需要将carry的值单独形成一个节点:
第三步:对新生成的链表反转。
反转之后的链表如下所示:
如果文字描述的不太清楚,你可以参考视频的详细讲解。
-
Python版本:数据结构笔试面试算法-Python语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Python语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕
https://www.bilibili.com/cheese/play/ep1370398
-
Java版本:哔哩哔哩_bilibili
https://www.bilibili.com/cheese/play/ep1366842
-
Golang版本:数据结构笔试面试算法-Go语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Go语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕
https://www.bilibili.com/cheese/play/ep1364599
3. 编码实现
核心伪代码如下:
函数 合并链表并相加(head1, head2):# 处理空链表情况如果 head1 为空:返回 head2如果 head2 为空:返回 head1# 步骤1:翻转两个链表h1 = 调用 reverse 函数翻转(head1)h2 = 调用 reverse 函数翻转(head2)# 步骤2:执行相加操作创建临时头节点 tmp_head(值为-1)current = tmp_headcarry = 0 # 进位值初始化# 遍历两个链表直到都处理完毕当 h1 不为空 或 h2 不为空 时:sum = carry # 初始化为进位值如果 h1 不为空:sum += h1的值h1 指向下一个节点如果 h2 不为空:sum += h2的值h2 指向下一个节点# 计算新值和进位carry = sum // 10 # 取整数除法结果new_val = sum % 10 # 取余数# 创建新节点并连接current.next = 创建新节点(new_val)current = current.next# 处理最后可能的进位如果 carry > 0:current.next = 创建新节点(carry)# 步骤3:翻转最终结果链表结果链表 = 调用 reverse 函数翻转(tmp_head.next)返回 结果链表
具体完整代码你可以参考下面视频的详细讲解。
-
Python版本:数据结构笔试面试算法-Python语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Python语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕
https://www.bilibili.com/cheese/play/ep1370398
-
Java版本:哔哩哔哩_bilibili
https://www.bilibili.com/cheese/play/ep1366842
-
Golang版本:数据结构笔试面试算法-Go语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Go语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕
https://www.bilibili.com/cheese/play/ep1364599
4.小结
两链表相加可以通过以下步骤完成:(1)反转链表;(2)执行链表节点值相加操作,在此过程中需要注意:当h2与h1都指向Null时,需要判断进位值carry是否为0,如果不为0,需要将carry的值单独形成一个节点;(3)对新生成的链表反转。
更多数据结构与算法视频讲解,你可以从以下地址找到:
-
Python编码实现:数据结构笔试面试算法-Python语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Python语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕
https://www.bilibili.com/cheese/play/ep1509965
-
Java编码实现:哔哩哔哩_bilibili
https://www.bilibili.com/cheese/play/ep1510007
-
Golang编码实现:哔哩哔哩_bilibili
https://www.bilibili.com/cheese/play/ep1509945
对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。
今日佳句:空山新雨后,天气晚来秋。