思路: (算法的空间复杂度和时间复杂度都很高,但比较好理解的一种方法) 将每一个加油站看成是一个节点,所有的加油站,就构成了一个环形链表。然后,就以每一个加油站为起点,看是否能绕一圈。(注: 代码中的 HashMap 存放的是,每一个加油站所在的索引) 最后,就能找到最终的结果啦。

import java.util.*;


public class Solution {

    public class ListNode {
        public int index;
        public int gas;
        public int cost;
        public ListNode next;
        ListNode(int index, int gas, int cost) {
            this.index = index;
            this.gas = gas;
            this.cost = cost;
        }
    }

    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param gas int整型一维数组
     * @param cost int整型一维数组
     * @return int整型
     */
    public int gasStation (int[] gas, int[] cost) {
        // write code here

        int len = gas.length;
        HashMap<Integer, ListNode> hashMap = new HashMap<>();
        ListNode head = new ListNode(0, gas[0], cost[0]);
        ListNode node = head;
        hashMap.put(0, head);
        for (int i = 1; i < len; i++) {
            ListNode tmpNode = new ListNode(i, gas[i], cost[i]);
            hashMap.put(i, tmpNode);
            node.next = tmpNode;
            node = tmpNode;
        }
        node.next = head;

        for (int i = 0; i < len; i++) {
            node = hashMap.get(i);
            int hasGas = node.gas;
            hasGas -= node.cost;
            while (hasGas >= 0) {
                node = node.next;

                if (node == hashMap.get(i)) {
                    return i;
                }

                hasGas += node.gas;
                hasGas -= node.cost;
            }
        }
        return -1;
    }
}