Given head which is a reference node to a singly-linked list. The value of each node in the linked list is either 0 or 1. The linked list holds the binary representation of a number.
Return the decimal value of the number in the linked list.
The most significant bit is at the head of the linked list.
Example 1:
Input: head = [1,0,1]
Output: 5
Explanation: (101) in base 2 = (5) in base 10
Example 2:
Input: head = [0]
Output: 0
Constraints:
The Linked List is not empty.
Number of nodes will not exceed 30.
Each node's value is either 0 or 1.
Solutions
Solution 1: Traverse the Linked List
Thinking
The list is a binary number from high bit to low. Shifting the running value left and ORing the current bit accumulates the integer. Length is at most \(30\), so it fits. We need not collect bits first.
We use a variable \(\textit{ans}\) to record the current decimal value, with an initial value of \(0\).
Traverse the linked list. For each node, left-shift \(\textit{ans}\) by one bit, then perform a bitwise OR with the current node's value. After traversal, \(\textit{ans}\) is the decimal value.
The time complexity is \(O(n)\), where \(n\) is the length of the linked list. The space complexity is \(O(1)\).
1 2 3 4 5 6 7 8 9101112
# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclassSolution:defgetDecimalValue(self,head:ListNode)->int:ans=0whilehead:ans=ans<<1|head.valhead=head.nextreturnans
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */funcgetDecimalValue(head*ListNode)(ansint){for;head!=nil;head=head.Next{ans=ans<<1|head.Val}return}