20200507:力扣151周赛下

力扣151周赛下

  • 题目
  • 思路与算法
  • 代码实现

题目

1. 从链表中删去总和值为零的连续节点
20200507:力扣151周赛下_第1张图片

思路与算法

  1. 只做第三题了,第四题太耗费时间了,第三题对存在的链表进行一个判断就会发现,我们只需要去掉其中相加为0的部分即可。但是该如何实现呢,想到使用map把这个和当前链表的值对应起来,如果找到某两个节点下的和相同,则他们中间的部分的和为0,将其删除即可。见代码。

代码实现

package com.immunize.leetcode.week151;

import java.util.HashMap;

public class Solution3 {
	// 定义的链表
	public class ListNode {
		int val;
		ListNode next;

		ListNode(int x) {
			val = x;
		}
	}

	public ListNode removeZeroSumSublists(ListNode head) {
		ListNode dummy = new ListNode(0);
		dummy.next = head;

		HashMap<Integer, ListNode> map = new HashMap<>();

		// 取得sum,表示当前节点之前的所有节点的和。存入map,分别作为key和value
		int sum = 0;
		for (ListNode d = dummy; d != null; d = d.next) {
			sum += d.val;
			map.put(sum, d);
		}

		// 将中间为0的部分删除,调用map的get方法,利用map中会覆盖相同key值所在的value的特性
		sum = 0;
		for (ListNode d = dummy; d != null; d = d.next) {
			sum += d.val;
			d.next = map.get(sum).next;
		}
		return dummy.next;
	}
}

你可能感兴趣的:(leetcode学习记录篇)