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
}
相关推荐
夏末秋也凉5 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
王老师青少年编程5 小时前
【GESP C++八级考试考点详细解读】
数据结构·c++·算法·gesp·csp·信奥赛
liuyuzhongcc8 小时前
List 接口中的 sort 和 forEach 方法
java·数据结构·python·list
计算机小白一个9 小时前
蓝桥杯 Java B 组之背包问题、最长递增子序列(LIS)
java·数据结构·蓝桥杯
卑微的小鬼10 小时前
数据库使用B+树的原因
数据结构·b树
cookies_s_s10 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
醉城夜风~11 小时前
[数据结构]双链表详解
数据结构
gyeolhada12 小时前
2025蓝桥杯JAVA编程题练习Day5
java·数据结构·算法·蓝桥杯
阿巴~阿巴~12 小时前
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
开发语言·数据结构·c++·算法·宽度优先
刃神太酷啦14 小时前
堆和priority_queue
数据结构·c++·蓝桥杯c++组