2-链表-两数相加II

这是链表算法的第二篇,这是两数相加的升级版,力扣链接

给你两个 非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

示例1:

复制代码
输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]

示例2:

复制代码
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]

这回就不一样了,不再是头头相加,而是尾尾相加。这种场景符合标准的栈的逻辑,后入先出。Go没有原生的栈,我们组装数组后左右指针也可以实现这个功能。

Go 复制代码
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	l1List, l2List := getList(l1), getList(l2)
	l, r, in := len(l1List)-1, len(l2List)-1, 0
	result := &ListNode{}
	cur := result
	for l >= 0 || r >= 0 {
		left := 0
		if l >= 0 {
			left = l1List[l]
			l--
		}
		right := 0
		if r >= 0 {
			right = l2List[r]
			r--
		}
		sum := left + right + in
		in = sum / 10
		cur = &ListNode{
			Val: sum % 10,
		}
		if result.Next != nil {
			cur.Next = result.Next
		}
		result.Next = cur
	}
	if in != 0 {
		cur = &ListNode{
			Val: in,
		}
		if result.Next != nil {
			cur.Next = result.Next
		}
		result.Next = cur
	}
	return result.Next
}

func getList(n *ListNode) []int {
	result := make([]int, 0)
	for n != nil {
		result = append(result, n.Val)
		n = n.Next
	}
	return result
}

当然可以做一些性能优化:

Go 复制代码
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	l1List, l2List := make([]int, 0), make([]int, 0)
	for l1 != nil || l2 != nil {
		if l1 != nil {
			l1List = append(l1List, l1.Val)
		}
		if l2 != nil {
			l2List = append(l2List, l2.Val)
		}
		if l1 != nil {
			l1 = l1.Next
		}
		if l2 != nil {
			l2 = l2.Next
		}
	}
	in := 0
	result := &ListNode{}
	for len(l1List) > 0 || len(l2List) > 0 {
		left := 0
		if len(l1List) > 0 {
			left = l1List[len(l1List)-1]
			l1List = l1List[:len(l1List)-1]
		}
		right := 0
		if len(l2List) > 0 {
			right = l2List[len(l2List)-1]
			l2List = l2List[:len(l2List)-1]
		}
		sum := left + right + in
		in = sum / 10
		result.Next = &ListNode{
			Val:  sum % 10,
			Next: result.Next,
		}
	}
	if in != 0 {
		result.Next = &ListNode{
			Val:  in,
			Next: result.Next,
		}
	}
	return result.Next
}
相关推荐
Pocker_Spades_A1 小时前
论文精读(五):面向链接预测的知识图谱表示学习方法综述
人工智能·链表·知识图谱
阿让啊8 小时前
C语言strtol 函数使用方法
c语言·数据结构·c++·单片机·嵌入式硬件
superlls11 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
Ripple1231212 小时前
数据结构:顺序表与链表
数据结构·链表
一个响当当的名号13 小时前
B树,B+树,B*树(无代码)
数据结构·b树
古译汉书14 小时前
嵌入式铁头山羊stm32-ADC实现定时器触发的注入序列的单通道转换-Day26
开发语言·数据结构·stm32·单片机·嵌入式硬件·算法
野犬寒鸦14 小时前
力扣hot100:相交链表与反转链表详细思路讲解(160,206)
java·数据结构·后端·算法·leetcode
GalaxyPokemon15 小时前
LeetCode - 1089. 复写零
数据结构
失散1315 小时前
分布式专题——1.2 Redis7核心数据结构
java·数据结构·redis·分布式·架构
zzzsde16 小时前
【数据结构】强化训练:从基础到入门到进阶(1)
数据结构