题目21:反转链表
题目描述:
反转一个单链表。
解决思路:
我们可以用迭代的方法来反转链表。我们用两个指针 prev 和 curr 分别指向链表中相邻的两个节点,然后将 curr 的 next 指向 prev,然后将 prev 和 curr 分别向后移动一个节点。直到 curr 为空,此时 prev 指向的节点就是反转后的头节点。
代码实现:
public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode next = curr.next; curr.next = prev; prev = curr; curr = next; } return prev; }
题目22:两数之和
题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回它们的数组下标。
解决思路:
我们可以用哈希表来解决这个问题。我们用一个哈希表来存储数组中每个元素的值和它的下标,然后遍历数组,对于每个元素,我们在哈希表中查找是否存在 target - nums[i] 的元素,如果存在,就返回这两个元素的下标。
代码实现:
public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (map.containsKey(complement)) { return new int[] {map.get(complement), i}; } map.put(nums[i], i); } return new int[] {}; }
题目23:三数之和
题目描述:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c,使得 a + b + c = 0?找出所有满足条件且不重复的三元组。
解决思路:
我们可以用双指针的方法来解决这个问题。首先,我们将数组排序。然后,我们固定一个数 nums[i],将问题转化为在 nums[i+1:n-1] 中找到两个数之和等于 -nums[i]。我们用两个指针 left 和 right 分别指向 nums[i+1] 和 nums[n-1],然后将它们的和与 -nums[i] 进行比较。如果和小于 -nums[i],就将 left 向右移动一个位置;如果和大于 -nums[i],就将 right 向左移动一个位置。如果和等于 -nums[i],就将这三个数加入结果集中,并分别将 left 和 right 向中间移动一个位置,直到 left 和 right 相遇为止。
代码实现:
public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> res = new ArrayList<>(); int n =nums.length; if (n < 3) { return res; } Arrays.sort(nums); for (int i = 0; i < n - 2; i++) { if (i > 0 && nums[i] == nums[i - 1]) { continue; } int target = -nums[i]; int left = i + 1; int right = n - 1; while (left < right) { int sum = nums[left] + nums[right]; if (sum == target) { res.add(Arrays.asList(nums[i], nums[left], nums[right])); while (left < right && nums[left] == nums[left + 1]) { left++; } left++; while (left < right && nums[right] == nums[right - 1]) { right--; } right--; } else if (sum < target) { left++; } else { right--; } } } return res; }