文章目錄
- 題目
- 題目決議
- 解題思維1
- 代碼如下:
- 代碼細節
- 解題思維二
- 代碼如下
題目

?
題目決議
鏈表頭節點的val值是二進制的最高位,依次遞減,
根據鏈表所有節點val值,所構成的二進制數,轉換成 十進制數,
?
解題思維1
一般人可能首先就是將鏈表逆序,然后,創建一個整形變數 result 來記錄 轉換成十進制數的結果,再去遍歷鏈表,每拿到一個節點的val值,就拿著val去乘以對應的 2^n 的階乘(n 從 0 開始,剛好就對應著 最低位 n 次冪的值) ,將每個節點的轉化成十進制數的結果,累加到result,最后回傳 result,
?
代碼如下:
/**
* 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) {
if(head == null){
return 0;
}
ListNode prev = head;//前驅節點
ListNode cur = head.next;// 逆序節點
while(cur!=null){// 遍歷鏈表,將其逆序,
ListNode curNext = cur.next;
cur.next = prev;
if(prev == head){
prev.next = null;
}
prev = cur;
cur = curNext;
}
head = prev;// 讓 head 永遠指向頭節點
ListNode tmp = head;
int result = 0;// 最終轉換成十進制數的結果
int n = 0;// n 次冪,從0開始,讓其與遍歷節點同步
while(tmp != null){// 將每個節點的轉化成十進制數的結果,累加到result,
result += tmp.val * Math.pow(2,n);
tmp = tmp.next;
n++;// 注意與遍歷節點,保持同步,
}
return result;
}
}

代碼細節

?
解題思維二
不采用逆序的方法,并且一次遍歷完成這個題目
這個解題思路,說不清,來看下面的舉例:
?
代碼如下
/**
* 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) {
ListNode cur = head;
int result = 0;
while(cur!= null){
result = result*2 + cur.val;
cur = cur.next;
}
return result;
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/403952.html
標籤:java

