写法一:遍历两次
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public int getDecimalValue(ListNode head) {
int length = 0;
int ans = 0;
ListNode p = head;
while(p != null){
length++;
p = p.next;
}
p = head;
while(p != null){
if(p.val != 0){
ans += Math.pow(2, length - 1);
}
p = p.next;
length--;
}
return ans;
}
}
写法二: 遍历一次(模拟)
- 每读取链表的一个节点值,可以认为读到的节点值是当前二进制数的最低位;
- 当读到下一个节点值的时候,需要将已经读到的结果乘以 222,再将新读到的节点值当作当前二进制数的最低位;
- 如此进行下去,直到读到了链表的末尾。
class Solution {
public int getDecimalValue(ListNode head) {
int ans = 0;
ListNode p = head;
while(p != null){
ans = ans * 2 + p.val;
p = p.next;
}
return ans;
}
}