LeetCode - 1290. Convert Binary Number in a Linked List to Integer

本文介绍了一种将二进制位链表转换为十进制数的方法。通过计算二进制位的指数并累加得到最终的十进制数值。提供了JavaScript和Python两种语言的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode - 1290. Convert Binary Number in a Linked List to Integer

在 LeetCode 的众多算法题目中,1290. Convert Binary Number in a Linked List to Integer聚焦于数据结构与进制转换的结合,是一道颇具代表性的基础算法题。它不仅考察对链表操作的熟悉程度,还检验我们将二进制数据转换为十进制的逻辑能力,接下来就一起探索其解题之道。

1. 题目详述

给定一个单链表,链表中的每个节点只存储 01,这些节点按顺序构成一个二进制数。例如,链表 1 -> 0 -> 1 代表二进制数 101。我们的任务是将这个以链表形式存储的二进制数,转换为对应的十进制整数并返回。这意味着输入是一个特殊的链表结构,每个节点都是二进制位,而输出则是一个单一的十进制数值。

2. 核心解题思路

解决本题的关键在于准确处理二进制位的权重,也就是计算每个二进制位对应的 2 的幂次,以此实现从二进制到十进制的转换。具体可拆解为以下两个步骤:

  • 计算链表长度,确定指数范围:通过遍历链表,记录链表节点的数量。该长度决定了每个二进制位对应的 2 的幂次指数,从最高位开始,指数依次递减。
  • 遍历链表进行转换:再次遍历链表,将每个节点的值(01)乘以其对应的 2 的幂次,然后将所有结果累加,最终得到的累加值就是我们需要的十进制结果。

3. JavaScript 代码实现与解析

/**
 * @param {ListNode} head
 * @return {number}
 */
var getDecimalValue = function (head) {
    let length = 0;
    let p = head;
    while (p) {
        length++;
        p = p.next;
    }
    p = head;
    let v = 0;
    while (p) {
        v += p.val * Math.pow(2, --length);
        p = p.next;
    }
    return v;
};

在这段 JavaScript 代码中:

  • 首先,通过第一个 while 循环,使用指针 p 对链表进行遍历。每经过一个节点,length 自增 1,当遍历结束时,length 记录下了链表的总长度,从而确定了每个二进制位对应的指数范围。
  • 接着,将指针 p 重新指向链表头节点,进入第二个 while 循环。在每次循环中,先将 length 减 1,再计算 2length 次幂,然后将当前节点的值 p.val 与之相乘,并累加到变量 v 中。当遍历完整个链表后,v 存储的就是转换后的十进制结果,最后将其返回。

4. Python 代码实现与解析

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def getDecimalValue(self, head: ListNode) -> int:
        length = 0
        p = head
        while p: 
            length = length+1
            p = p.next
        
        p = head
        v = 0
        while p :
            length = length - 1
            v += p.val * math.pow(2, length)
            p = p.next

        return int(v)

Python 代码的逻辑与 JavaScript 类似:

  • 先利用 while 循环遍历链表,计算链表长度 length,明确每个二进制位的指数信息。
  • 随后,再次通过 while 循环遍历链表。在循环过程中,每次将 length 减 1,然后将当前节点值 p.val2length 次幂相乘,并累加到变量 v 上。当遍历完链表,v 即为所求的十进制数值,最后将其转换为整数类型返回。

5. 复杂度分析

  • 时间复杂度:算法进行了两次链表遍历,每次遍历的时间复杂度均为 O ( n ) O(n) O(n),其中 n n n 是链表的长度。因此,整体时间复杂度为 O ( n ) O(n) O(n)
  • 空间复杂度:在整个算法过程中,除了使用到几个固定的变量(如 lengthv 等),没有占用与链表长度相关的额外空间,所以空间复杂度为 O ( 1 ) O(1) O(1)

6. 总结

通过对 LeetCode 1290 题的分析与两种语言的代码实现,我们掌握了将二进制链表转换为十进制整数的方法。解题过程中,双循环遍历链表的方式简洁有效,既确定了二进制位的权重,又完成了进制转换。虽然 JavaScript 和 Python 语法不同,但核心思路一致,这也体现了算法思维在不同编程语言中的通用性。如果你在刷题过程中遇到类似的数据结构与进制转换结合的问题,不妨借鉴本文的思路。同时,对于代码优化、其他解法等方面,也欢迎在评论区交流讨论,共同提升算法能力!

上述博客完整呈现了该题的解题过程与要点。若你希望增加示例演示、补充其他语言解法,或对内容有其他修改想法,随时和我说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿蒙Armon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值