题目:
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
限制:
0 <= 链表长度 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
见解:
首次接触该题还不清楚该题解法的最优的时间复杂度在什么级别上时,自己想了很多复杂的手段去解题。
如果清楚了题解算法的时间复杂度的 “天花板” 了:
知道获取元素个数一个n、填充元素到返回值一个n,这两个n是逃不了的。此后再进行设法解题就没这么天马行空了。
(解题应从简单的解法设法入手)
1 import java.util.*; 2 /** 3 * @author 不乏理想的三师弟 4 */ 5 public class Solution { 6 /** 7 * 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 8 */ 9 10 // 解法一 11 public int[] reversePrint1(ListNode head) { 12 ArrayList<Integer> list = new ArrayList<>(); 13 while(head != null) { 14 list.add(head.val); 15 head = head.next; 16 } 17 18 int length = list.size(); 19 int[] results = new int[length]; 20 int i = 0; 21 while(length > 0) { 22 results[i++] = list.get(--length); 23 } 24 return results; 25 } 26 // 解法二 27 public int[] reversePrint(ListNode head) { 28 int length = 0; 29 ListNode index = head; 30 while(index != null) { 31 index = index.next; 32 length++; 33 } 34 35 int[] results = new int[length]; 36 while(head != null) { 37 results[--length] = head.val; 38 head = head.next; 39 } 40 return results; 41 } 42 } 43 44 class ListNode { 45 int val; 46 ListNode next; 47 48 ListNode(int x) { 49 val = x; 50 } 51 }