LC 1290.Convert Binary Number in a Linked List to Integer

题目描述

这是 LeetCode 上的 1290. 二进制链表转整数 ,难度为简单

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。

请你返回该链表所表示数字的 十进制值

示例 1:

1
2
3
输入:head = [1,0,1]
输出:5
解释:二进制数 (101) 转化为十进制数 (5)

示例 2:

1
2
输入:head = [0]
输出:0

示例 3:

1
2
输入:head = [1]
输出:1

示例 4:

1
2
输入:head = [1,0,0,1,0,0,1,1,1,0,0,0,0,0,0]
输出:18880

示例 5:

1
2
输入:head = [0,0]
输出:0

提示:

  • 链表不为空。
  • 链表的结点总数不超过 30
  • 每个结点的值不是 0 就是 1

解答

方法一:位运算

利用位运算的性质,左移相当于乘以 2 ,右边多出来的二进制位自动填零。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public int getDecimalValue(ListNode head) {
int res = head.val;
while (head.next != null) {
res <<= 1;
res += head.next.val;
head = head.next;
}
return res;
}
}
  • 时间复杂度\(O(n)\),其中 n 为链表的长度。

  • 空间复杂度\(O(1)\)

方法二:模拟

按照题目的要求,每次都乘二再加上下一个数,相当于二进制转换十进制的原理。

1
2
3
4
5
6
7
8
9
10
class Solution {
public int getDecimalValue(ListNode head) {
int res = 0;
while(head != null){
res = res * 2 + head.val;
head = head.next;
}
return res;
}
}
  • 时间复杂度\(O(n)\),其中 n 为链表的长度。

  • 空间复杂度\(O(1)\)

每题一图


LC 1290.Convert Binary Number in a Linked List to Integer
https://chen-huaneng.github.io/2023/12/11/2023-12-11-2023-12-11-lc-1290/
作者
Abel
发布于
2023年12月11日
更新于
2023年12月11日
许可协议