LeetCode - 1290. Convert Binary Number in a Linked List to Integer
在 LeetCode 的众多算法题目中,1290. Convert Binary Number in a Linked List to Integer聚焦于数据结构与进制转换的结合,是一道颇具代表性的基础算法题。它不仅考察对链表操作的熟悉程度,还检验我们将二进制数据转换为十进制的逻辑能力,接下来就一起探索其解题之道。
1. 题目详述
给定一个单链表,链表中的每个节点只存储 0
或 1
,这些节点按顺序构成一个二进制数。例如,链表 1 -> 0 -> 1
代表二进制数 101
。我们的任务是将这个以链表形式存储的二进制数,转换为对应的十进制整数并返回。这意味着输入是一个特殊的链表结构,每个节点都是二进制位,而输出则是一个单一的十进制数值。
2. 核心解题思路
解决本题的关键在于准确处理二进制位的权重,也就是计算每个二进制位对应的 2 的幂次,以此实现从二进制到十进制的转换。具体可拆解为以下两个步骤:
- 计算链表长度,确定指数范围:通过遍历链表,记录链表节点的数量。该长度决定了每个二进制位对应的 2 的幂次指数,从最高位开始,指数依次递减。
- 遍历链表进行转换:再次遍历链表,将每个节点的值(
0
或1
)乘以其对应的 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,再计算2
的length
次幂,然后将当前节点的值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.val
与2
的length
次幂相乘,并累加到变量v
上。当遍历完链表,v
即为所求的十进制数值,最后将其转换为整数类型返回。
5. 复杂度分析
- 时间复杂度:算法进行了两次链表遍历,每次遍历的时间复杂度均为 O ( n ) O(n) O(n),其中 n n n 是链表的长度。因此,整体时间复杂度为 O ( n ) O(n) O(n)。
- 空间复杂度:在整个算法过程中,除了使用到几个固定的变量(如
length
、v
等),没有占用与链表长度相关的额外空间,所以空间复杂度为 O ( 1 ) O(1) O(1)。
6. 总结
通过对 LeetCode 1290 题的分析与两种语言的代码实现,我们掌握了将二进制链表转换为十进制整数的方法。解题过程中,双循环遍历链表的方式简洁有效,既确定了二进制位的权重,又完成了进制转换。虽然 JavaScript 和 Python 语法不同,但核心思路一致,这也体现了算法思维在不同编程语言中的通用性。如果你在刷题过程中遇到类似的数据结构与进制转换结合的问题,不妨借鉴本文的思路。同时,对于代码优化、其他解法等方面,也欢迎在评论区交流讨论,共同提升算法能力!
上述博客完整呈现了该题的解题过程与要点。若你希望增加示例演示、补充其他语言解法,或对内容有其他修改想法,随时和我说。