力扣刷题1290——二进制链表转整数

题目:

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

示例:

力扣刷题1290——二进制链表转整数_第1张图片

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

输出:5

解释:二进制数 (101) 转化为十进制数 (5)

方法1

解题思路:

        要将一个二进制链表转为十进制,我们知道二进制转十进制时,需要知道二进制数的个数n,然后遍历二进制数,第n位二进制数字a转为十进制为a*2^(n-1),所以我们要先遍历一遍链表,然后用n记录链表的长度,然后再遍历一遍链表,用sum来记录十进制数,每次遍历都先n--,由于0转十进制还是0,所以遇到0就让指针后移,遇到1,就使sum+=pow(2,n),遍历链表结束后sum就是该链表所在数字的十进制数字。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    int getDecimalValue(ListNode* head) {
        int n=0;//用来记录链表长度
        ListNode *p=head;//用来遍历链表得到链表长度
        while(p){
            n++;
            p=p->next;
        }
        int sum=0;//记录链表十进制值
        ListNode *pp=head;//用来遍历链表
        while(pp){
            n--;
            if(pp->val==1){
                sum+=pow(2,n);//二进制转十进制
            }
            pp=pp->next;
        }
        return sum;
    }
};

时间复杂度:O(n),n表示链表长度

空间复杂度:O(1)

方法二

        从链表头节点(二进制高位)开始读取,每读取链表的一个节点值,可以认为读到的节点值是当前二进制数的最低位;当读到下一个节点值的时候,需要将已经读到的结果乘以 2,再将新读到的节点值当作当前二进制数的最低位;如此进行下去,直到读到了链表的末尾。最前面的数字应该要乘的2的个数就是其后面数字的个数。

力扣刷题1290——二进制链表转整数_第2张图片

class Solution {
public:
    int getDecimalValue(ListNode* head) {
        ListNode *cur=head;
        int ans=0;
        while(cur){
            ans=ans*2+cur->val;
            cur=cur->next;
        }
        return ans;
    }
};

方法3——递归

class Solution {
public:
    int sum=0;//十进制值
    int k=1;//二进制数字最后一个数代表的的十进制值
    int getDecimalValue(ListNode* head) {
        if(head==nullptr) return sum;//递归回退
        getDecimalValue(head->next);//递归下一个节点
        if(head->val==1){//二进制位值为1的节点,进行累加
            sum+=k;
        }
        k*=2;//下一个二进制位要*的值(2^(n-1))
        return sum;
    }
};

你可能感兴趣的:(力扣刷题笔记——链表,链表,leetcode,c++,算法)