在问 · 算法题解

1290. 二进制链表转整数

题目描述

输入单链表的头节点 head,链表用数组表示,例如 [1,0,1]。每个节点的值是 0 或 1。

从头到尾读出这些值,就是一个二进制数,链表开头是最高位。返回这个二进制数对应的十进制整数。

示例 1
输入:head = [1,0,1]
输出:5

解释:二进制 101 等于十进制 5。

示例 2
输入:head = [0]
输出:0

数据范围

  • 链表非空。
  • 节点总数不超过 30。
  • 每个节点的值是 0 或 1。

解题思路

我们事先不知道链表长度,没法直接算每一位的权重。换个思路:从高位往低位读,维护 ans = 已读入的那些位组成的二进制数。每读入一位 bit,就令 ans = ans * 2 + bit,相当于把已有结果左移一位,再把 bit 放到最低位。

为什么正确

读完前 k 个节点后,ans 等于这 k 位组成的二进制数的值。

复杂度分析

时间 O(n),额外空间 O(1)。

易错点

不要写成 ans * 10 + bit,那是十进制拼接。也不必先求长度再按 2 的幂累加,一次遍历就够了。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

class Solution:
    def getDecimalValue(self, head: Optional[ListNode]) -> int:
        ans = 0
        while head:
            ans = ans * 2 + head.val
            head = head.next
        return ans

载入编辑器,自己跑一遍 →

链表 专题的其他题目

查看 链表 全部题目 →