题目描述:
给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。
请你返回该链表所表示数字的 十进制值 。
示例 1:
输入:head = [1,0,1]
输出:5
解释:二进制数 (101) 转化为十进制数 (5)
示例 2:
输入:head = [0]
输出:0
示例 3:
输入:head = [1]
输出:1
示例 4:
输入:head = [1,0,0,1,0,0,1,1,1,0,0,0,0,0,0]
输出:18880
示例 5:
输入:head = [0,0]
输出:0
提示:
链表不为空。
链表的结点总数不超过 30。
每个结点的值不是 0 就是 1。
思路:
1、最高效的操作是 位运算:
从第一个链表开始,每次sum 左移一位(相当于 ×2),再加上(相当于 或 操作)此时链表节点的val。
2、想不到位操作,可以考虑先遍历一遍链表,知道链表的长度 num,然后再用 正常的二进制转 10进制方法。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int getDecimalValue(struct ListNode* head){
int sum = 0;
while(head){
sum = sum*2 + head->val;
head = head->next;
}
return sum;
}
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int getDecimalValue(struct ListNode* head){
int sum = 0;
while(head){
sum = (sum<<1) | head->val;//左移1位后 与 val 或
head = head->next;
}
return sum;
}
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int func(int num){
int sum = 1;
for(int i=0; i<num-1; ++i){
sum = sum * 2;
}
return sum;
}
int getDecimalValue(struct ListNode* head){
struct ListNode* h;
h = head;
int num = 0;
while(h){
++num;
h = h->next;
}
int sum = 0;
while(head){
sum += (head->val * func(num--));
head = head->next;
}
return sum;
}

本文介绍了一种将链表表示的二进制数转换为十进制数的方法,通过遍历链表并使用位运算进行计算,实现了高效转换。提供了两种实现思路,一种是直接使用位运算,另一种是先确定链表长度再进行转换。
1517

被折叠的 条评论
为什么被折叠?



