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

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

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 语法不同,但核心思路一致,这也体现了算法思维在不同编程语言中的通用性。如果你在刷题过程中遇到类似的数据结构与进制转换结合的问题,不妨借鉴本文的思路。同时,对于代码优化、其他解法等方面,也欢迎在评论区交流讨论,共同提升算法能力!

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

### 单链表的时间和空间复杂度分析 #### 时间复杂度分析 对于单链表而言,在不同操作下的时间复杂度有所不同: - **查找操作**:由于线性链表仅能顺序存取,因此每次查找都需要从头指针开始逐个比较直到找到目标或者到达链表末端。这意味着最坏情况下需要遍历整个列表,从而使得查找的时间复杂度为 O(n),其中 n 表示链表中的节点数量[^2]。 - **插入操作**:如果已经给出了前驱节点的位置,则可以直接在其后面添加新节点,此时插入操作的时间复杂度为 O(1);但如果未给出具体位置而需按照特定条件(如值相等)来定位插入点的话,则可能需要遍历整条链路去寻找合适的地方,这样整体时间开销会达到 O(n)。 - **删除操作**:同样地,当已知待移除元素的确切位置时可迅速完成该动作并保持 O(1) 的效率水平;然而通常情况下为了确定被删对象及其前置单元之间的关系往往也需要经历一次完整的扫描过程,最终导致平均意义上的时间消耗呈现 O(n) 特征。 另外值得注意的是某些特殊场景下涉及多层嵌套循环处理多个关联链条的情形,比如对比两条独立但存在交集可能性的序列 A 和 B ,这时总的工作量取决于两者长度之和即 O(|A| + |B|)[^1]。 最后关于反转这样一个典型应用实例,无论是采用迭代还是递归方法实现其核心逻辑都是沿着原路径反向构建新的连接关系直至覆盖原有结构为止,此过程中每步都要访问当前剩余部分的第一个成员因而总体上也表现出 O(n) 的特性[^5]。 #### 空间复杂度分析 就简单形式上的单链表来说,除了存储实际数据外还需要额外分配一定量的空间用于保存指向下一个结点的引用信息。假设每个节点占用固定大小 S 的内存块,则创建 N 个这样的实体总共就需要大约 NS 字节的空间资源。不过考虑到大多数编程环境中动态申请这些片段并不会直接增加程序运行期间显式的辅助栈/队列之类的临时容器规模,所以在讨论纯粹由链式结构本身引起的空间需求变化趋势时一般认为是常数级别的增长模式——也就是所谓的 O(N) 或者更精确地说应该是 Θ(N),因为无论输入怎样改变始终维持着正比例于元素总数的关系不变[^4]。 ```cpp // C++ code snippet demonstrating basic singly linked list node definition and space usage. struct ListNode { int val; struct ListNode *next; // Each instance of this structure consumes a fixed amount of memory, contributing to the overall linear growth pattern described above. }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿蒙Armon

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

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

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

打赏作者

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

抵扣说明:

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

余额充值