一、题目描述
题目:给你一个单链表的引用结点 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
来源:力扣(LeetCode)
二、代码具体实现(C语言)
方法一:对于补码表示的数据,只要没有超过虽规定的数值范围,每算术左移或者逻辑左移一位,即各位顺序向左移一位,最高位移出,最低位补进一个0,相当于此数据乘以2;
int getDecimalValue(struct ListNode* head){
int num = 0;//记录转化之后的十进制数
struct ListNode* p = head;
while(p){
num = num*2+p->val;
p = p->next;
}
return num;
}
方法二:两次遍历,第一次记录链表长度,第二次进行转换,如注释:
int getDecimalValue(struct ListNode* head){
int num = 0;
int flag = 0;
struct ListNode* p = head;
while(p->next){
flag++;
p = p->next;
}
p = head;
while(p->next){
if(p->val==1){
num = num + pow(2,flag);
}
flag--;
p=p->next;
}
num = num + p->val;
return num;
}