当前位置:首页 > 力扣 > 线性遍历+二进制 6行代码征服二进制链表转整数

线性遍历+二进制 6行代码征服二进制链表转整数

10个月前 (05-17)

力扣1290.二进制链表转整数

线性遍历+二进制 6行代码征服二进制链表转整数 算法 C++ 迭代 模拟 进制转换 链表 单链表 数据结构 第1张

题目本质

给定一个单链表的头节点head,链表中每个节点的值为0或1。链表表示一个‌最高有效位在前‌的二进制数字,要求将其转换为对应的十进制整数。例如链表1→0→1对应的二进制数是101,应返回十进制数5。


解题思路与推导过程

一、算法核心思想

  1. ‌1.二进制数构造规则‌:

    • 每个新节点的值相当于二进制数‌向左移位‌后的最低位

    • 例如遍历到第三个节点时,计算过程相当于(前值<<1) | 当前值

  2. ‌2.累加计算‌:

    • 初始化sum=0作为累加结果

    • 每次循环执行sum = sum*2 + 当前节点值(等价于位运算sum<<1 | val

  3. 3‌.遍历特性‌:

    • 无需反转链表,直接按照遍历顺序处理

    • 时间复杂度O(n),空间复杂度O(1)

二、代码流程解析

  • ‌1.初始化‌:sum=0作为十进制结果的容器

  • ‌2.循环处理每个节点‌:

    1. sum = sum*2:将之前的结果左移一位(二进制进位)

    2. +head->val:将当前位的二进制值加入最低位

    3. head=head->next指针后移处理下一位

  • 3‌.终止条件‌:链表指针指向NULL时结束遍历

三、潜在问题与解决方案

  • 大数溢出‌:使用long long类型存储中间结果(题目保证链表长度≤30,long long足够存储2^30量级的数值)

  • 头节点为空的边界情况‌:题目约束链表非空,无需额外判断1


代码+注释

class Solution {
public:
    int getDecimalValue(ListNode* head) {
        long long sum=0; // 使用long long避免中间计算溢出
        while(head)      // 遍历直到链表末尾
        {
            // 核心计算公式:每次将之前结果左移一位,并加上当前二进制位
            sum = (long long)sum*2 + head->val; 
            
            // 类型转换说明:防止sum超过int范围时的计算错误
            head = head->next; // 指针后移处理下个节点
        }
        return sum; // 最终结果自动转为int(题目保证数值在int范围内)
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第92题:三步定位 精准反转链表指定区间

力扣第92题:三步定位 精准反转链表指定区间

题目解读给定一个单链表和两个整数left与right,要求将链表中从第left个节点到第right个节点的部分进行反转,而保持其他部分不变。例如,对于链表1→2→3→4→5,left=2,right=...

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

题目解读给定一个整数数组,我们需要找到一个中心索引,使得该索引左侧所有元素的和等于右侧所有元素的和。如果不存在这样的索引,则返回-1。中心索引的定义不包含在左右两侧的和计算中。这个问题考察对数组遍历和...

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

一、题目解读洛谷B3617题要求将输入的八进制字符串转换为十六进制表示。题目需处理大数场景,且对输入合法性有明确限制(长度不超过1000,仅包含0-7字符)。由于八进制与十六进制无法直接转换,需借助十...

力扣1472题解:浏览器历史记录模拟(C++代码实现与详细解析)

力扣1472题解:浏览器历史记录模拟(C++代码实现与详细解析)

一、题目解读力扣1472题要求设计一个“浏览器历史记录”类,支持以下功能:    1. 初始化浏览器,指定首页URL;   &nb...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。