Leetcode 1290. 二进制链表转整数(简单) 位运算 的应用

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

题目描述:

给你一个单链表的引用结点 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;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值