资讯动态

LeetCode-Go 题解精讲:1290. Convert Binary Number in a Linked List to Integer(链表二进制转十进制)

发布时间:2026/9/13 3:01:09 来源:尧图企业网站定制
LeetCode-Go 题解精讲1290. Convert Binary Number in a Linked List to Integer链表二进制转十进制【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go本篇文章围绕 LeetCode 第 1290 题「Convert Binary Number in a Linked List to Integer链表中的二进制数转整数」展开以 leetcode/1290.Convert-Binary-Number-in-a-Linked-List-to-Integer/README.md 的官方题解为骨架结合当前仓库中该题目的 Go 源码实现 与 单元测试深入讲解「边遍历边累加」的迭代算法原理、复杂度分析、链表构造辅助工具以及如何在本仓库环境下运行测试。读完本文你将掌握链表与进制转换结合题目的通用解法并能独立在仓库中定位、运行与验证本题代码。一、题目回顾与题意拆解题目原文摘自关联文档Givenheadwhich is a reference node to a singly-linked list. The value of each node in the linked list is either 0 or 1. The linked list holds the binary representation of a number. Return thedecimal valueof the number in the linked list.即给定单链表头结点head链表中每个结点的值非 0 即 1整条链表按从头到尾的顺序保存了一个整数的二进制表示要求返回该二进制数对应的十进制值。从仓库源码看题目要求的ListNode结构在仓库中统一定义于 structures/ListNode.go// ListNode 是链接节点 type ListNode struct { Val int Next *ListNode }链表头部是二进制数的最高位Most Significant BitMSB。例如链表1 - 0 - 1表示二进制数(101)₂其十进制值为 5。示例数据速览题目给出 5 组示例均已在仓库测试中覆盖输入链表头到尾二进制含义十进制输出[1,0,1](101)₂5[0](0)₂0[1](1)₂1[1,0,0,1,0,0,1,1,1,0,0,0,0,0,0](100100111000000)₂18880[0,0](00)₂0约束条件链表不为空The Linked List is not empty。链表结点总数不超过 30Number of nodes will not exceed30。每个结点的值只能是0或1Each nodes value is either0or1。结点数不超过 30意味着最大表示的二进制数为 30 位远在 32 位int的表示范围内最大2³⁰ - 1因此使用 Go 的int类型累加不会发生溢出这也是可以直接用整数运算累加的前提。二、解题思路边遍历边累加Horner 算法原文档给出的解题思路非常精炼给出一个链表链表从头到尾表示的数是一个整数的二进制形式要求输出这个整数的十进制。简单题从头到尾遍历一次链表边遍历边累加二进制位。其核心思想是Horner 算法秦九韶算法从头结点最高位开始每读入一个二进制位bit就把当前累积值左移一位乘 2再加上该位即sum sum * 2 bit以1 - 0 - 1为例模拟步骤当前结点累加过程sum110 * 2 11201 * 2 02312 * 2 15最终得到 5与(101)₂ 1×2² 0×2¹ 1×2⁰ 5完全一致。该过程本质上是在顺序遍历过程中完成了从高位到低位的位权展开避免了先求链表长度再逐位乘位权的两次遍历。三、仓库源码实现与逐行剖析仓库中的实现位于 leetcode/1290.Convert-Binary-Number-in-a-Linked-List-to-Integer/1290. Convert Binary Number in a Linked List to Integer.gopackage leetcode import ( github.com/halfrost/LeetCode-Go/structures ) // ListNode define type ListNode structures.ListNode // getDecimalValue 将二进制链表转换为十进制整数 func getDecimalValue(head *ListNode) int { sum : 0 for head ! nil { sum sum*2 head.Val head head.Next } return sum }逐行解读类型别名type ListNode structures.ListNode把仓库统一数据结构包 structures/ListNode.go 中的ListNode引入到leetcode包中保证各题共用同一份链表定义避免重复造轮子。初始化sum : 0作为十进制结果的累加器。遍历循环for head ! nil从头到尾遍历链表循环内执行核心递推sum sum*2 head.Val。指针推进head head.Next移动到下一个结点循环结束时所有二进制位均已处理。返回结果直接返回累加后的十进制整数。该实现是典型的一次遍历 O(n) 解法不依赖额外数据结构空间开销为 O(1)。两种等价写法对比sum*2 bit也可以写成位运算形式(sum 1) | bit两者在整数运算上完全等价。仓库选择了更直白、易读的算术写法适合作为教学示例。若追求位运算风格可写成func getDecimalValue(head *ListNode) int { sum : 0 for head ! nil { sum (sum 1) | head.Val head head.Next } return sum }由于二进制位只能是 0 或 1(sum 1) | bit与sum*2 bit结果恒等读者可以根据团队编码风格任选其一。四、单元测试题目五组用例全覆盖仓库为本题配套了完整的表驱动测试位于 leetcode/1290.Convert-Binary-Number-in-a-Linked-List-to-Integer/1290. Convert Binary Number in a Linked List to Integer_test.gotype question1290 struct { para1290 ans1290 } // para 是参数 // one 代表第一个参数 type para1290 struct { one []int } // ans 是答案 // one 代表第一个答案 type ans1290 struct { one int } func Test_Problem1290(t *testing.T) { qs : []question1290{ { para1290{[]int{1, 0, 1}}, ans1290{5}, }, { para1290{[]int{0}}, ans1290{0}, }, { para1290{[]int{1}}, ans1290{1}, }, { para1290{[]int{0, 0}}, ans1290{0}, }, { para1290{[]int{1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0}}, ans1290{18880}, }, } fmt.Printf(------------------------Leetcode Problem 1290------------------------\n) for _, q : range qs { _, p : q.ans1290, q.para1290 fmt.Printf(【input】:%v 【output】:%v\n, p, getDecimalValue(structures.Ints2List(p.one))) } fmt.Printf(\n\n\n) }测试结构说明测试采用仓库统一的questionXXX/paraXXX/ansXXX表驱动模式para1290描述输入[]int切片ans1290描述期望输出。5 组用例与题目给出的 5 个示例一一对应其中包含长度 15 的[1,0,0,1,0,0,1,1,1,0,0,0,0,0,0] → 18880的较大规模用例用于验证累积过程的正确性。测试通过structures.Ints2List(p.one)将整数切片转换为链表再调用getDecimalValue并打印输入输出便于人工核对。测试用的链表构造工具测试中使用的Ints2List与List2Ints定义于 structures/ListNode.goInts2List(nums []int) *ListNode将整数切片按顺序构造成单链表空切片返回nil测试输入用它把[1,0,1]变成1 - 0 - 1。List2Ints(head *ListNode) []int反向把链表还原为切片内部带 100 层深度限制若链表过长或成环会直接 panic避免测试死循环。这两个工具是仓库大量链表题共用的基础设施理解它们有助于阅读其他链表类题目的测试代码。五、复杂度分析与边界情况时间复杂度O(n)其中 n 为链表结点数题目约束 n ≤ 30。算法仅需从头到尾单次遍历每步只做一次乘加运算。空间复杂度O(1)只使用一个整型累加变量sum不申请额外存储。边界情况梳理均已被测试覆盖单结点[0] → 0、[1] → 1循环执行一次即返回无需特殊处理。全零链表[0,0] → 0任何二进制位乘 2 累加后仍为 0。前导零如[0,0]这类以 0 开头的链表前导零不影响最终数值算法天然兼容。最长链表30 位全 1 时结果最大为2³⁰ - 1 1073741823仍在int范围内无溢出风险这也是题目把结点数限制为 30 的原因。六、在本仓库中运行与验证本项目根目录的 go.mod 声明模块名为github.com/halfrost/LeetCode-Go并通过replace指令将structures等内部包指向本地目录因此克隆仓库后无需额外下载内部依赖即可运行。在仓库根目录执行以下命令即可单独运行本题测试# 运行 1290 题专属测试-v 输出详细日志 go test -v -run Test_Problem1290 ./leetcode/1290.Convert-Binary-Number-in-a-Linked-List-to-Integer/运行后会输出类似如下内容 RUN Test_Problem1290 ------------------------Leetcode Problem 1290------------------------ 【input】:[1 0 1] 【output】:5 【input】:[0] 【output】:0 【input】:[1] 【output】:1 【input】:[0 0] 【output】:0 【input】:[1 0 0 1 0 0 1 1 1 0 0 0 0 0 0] 【output】:18880 --- PASS: Test_Problem1290 (0.00s) PASS ok github.com/halfrost/LeetCode-Go/leetcode/1290.Convert-Binary-Number-in-a-Linked-List-to-Integer 0.006s如需全量验证整个leetcode包可执行go test ./leetcode/...仓库根目录还提供了 gotest.sh 脚本用于一次性生成合法、单一的覆盖率文件coverage.txt./gotest.sh该脚本底层执行go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...使用atomic覆盖模式供 Codecov 等工具解析。题目的覆盖率结果可在仓库根目录的 coverage.txt 中查看如github.com/halfrost/LeetCode-Go/leetcode/1290.Convert-Binary-Number-in-a-Linked-List-to-Integer相关条目。七、小结本题是链表遍历与进制转换结合的基础题仓库给出的解法仅 6 行核心逻辑却同时体现了三个值得积累的要点方向感链表头部是二进制最高位必须从头到尾遍历才能在不知道链表长度的情况下按「乘 2 进位」的方式逐位累加。算法本质sum sum*2 bit是 Horner 求值法在二进制场景下的直接应用一次遍历即可完成位权展开无需预知链表长度或二次遍历。工程配套仓库通过 structures/ListNode.go 统一链表定义与构造/还原工具配合表驱动测试与覆盖率脚本gotest.sh让每道题都能被低成本验证。掌握这一「边遍历边累加」的范式后遇到类似「链表表示数、要求求值」的题目例如链表表示十进制大数、二进制求和等都可以沿用同样的单次遍历累加思路快速求解。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价