题目

82. Remove Duplicates from Sorted List II

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

Return the linked list sorted as well.

Example 1:

Input: 1->2->3->3->4->4->5
Output: 1->2->5

Example 2:

Input: 1->1->1->2->3
Output: 2->3

定义公用的链表

用于打印链表数据

package common;public class ListNode {public int val;public  ListNode next;public ListNode(int val) {this.val = val;}static public ListNode listNodeWithIntArray(int[] input) {ListNode head = new ListNode(0);ListNode node = head;for (int i: input) {ListNode newNode = new ListNode(i);node.next = newNode;node = node.next;}return head.next;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();ListNode node = this;while (node != null) {sb.append(node.val).append("-->");node = node.next;}return sb.append("Null").toString();}@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}return false;}
}

遍历解法

思路:

  1. 用快慢两个指针,慢指针指着上一个节点,快指针找出下一个不重复的节点;
  2. 如果找到重复的节点,则慢指针的下一个节点就不等于当前快指针 if (slow.next != fast),那慢指针就指向快指针的下一个值;也就是下一个不重复的值;
  3. 如果没找到重复的节点,则都指向下一个节点;
  4. 无论是否找到重复的节点,快指针都要指向下一个节点fast = fast.next;
package linkedlist;import common.ListNode;public class RemoveDuplicatesFromSortedListII {public ListNode deleteDuplicates(ListNode head) {//check edgeif (head == null || head.next == null) {return head;}ListNode dummy = new ListNode(0);ListNode slow = dummy;ListNode fast = head;slow.next = fast;while (fast != null) {while (fast.next != null && fast.val == fast.next.val) {fast = fast.next; // while loop to find the last duplicate item}// find duplicateif (slow.next != fast) {slow.next = fast.next;  // remove the duplicate items} else {slow = slow.next; // move down next point}fast = fast.next;}return dummy.next;}
}

递归解法

递归的思路就是翻译了遍历的做法。

  1. 如果当前节点不是唯一节点,则递归调用指向下一个节点。
  2. 如果当前节点是唯一节点,则用当前节点指向,递归调用的下一个节点。
package linkedlist;import common.ListNode;public class RemoveDuplicatesFromSortedListII {/*** if current node is not unique, return deleteDuplicates with head.next.* If current node is unique, link it to the result of next list made by recursive call. Any improvement?* @param head* @return*/public ListNode deleteDuplicatesWithRecursive(ListNode head) {if (head == null) {return head;}if (head.next != null && head.val == head.next.val) {while (head.next != null && head.val == head.next.val) {head = head.next;}return deleteDuplicatesWithRecursive(head.next);} else {head.next = deleteDuplicatesWithRecursive(head.next);}return head;}
}

算法:在有序的链表中删除掉所有重复的数据(包括重复本身的节点)Remove Duplicates from Sorted List II相关推荐

  1. 数据结构例1.已知顺序表L的长度为n,试编写算法实现在顺序表中删除值为elem的数据元素

    //已知顺序表L的长度为n,试编写算法实现在顺序表中删除值为elem的数据元素 //(其中n与elem从键盘输入) # include <iostream> # include <s ...

  2. leetcode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)

    目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3-& ...

  3. 删除排序数组中的重复数字 II · Remove Duplicates from Sorted Array II

    重复一次 [抄题]: 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. [思维问题]: [ ...

  4. lintcode :Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II

    题目: 删除排序数组中的重复数字 II 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 样例 给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A ...

  5. [Leetcode] Remove duplicates from sorted array ii 从已排序的数组中删除重复元素

    Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For examp ...

  6. 删除重复值(2以上)Remove Duplicates from Sorted Array II

    2019独角兽企业重金招聘Python工程师标准>>> 问题: Follow up for "Remove Duplicates": What if duplic ...

  7. 无头结点单链表的逆置_从无头单链表中删除节点及单链表的逆置

    题目: 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(非第一个节点, 也非最后一个节点).请将该节点从单链表中删除. 解答: 典型的"狸猫换太子", 若要删除该 ...

  8. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点...

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /*** @Description:在单链表和双链表中删除倒数第K个节点* @Author: lizhouwei* @CreateDate: ...

  9. 从无头单链表中删除节点 结构之法 4

    题目: 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个节点),请将该节点从单链表中删除. 分析与解答: 假设给定的指针为pCurrent,Node *pN ...

  10. 编程之美-从无头单链表中删除节点方法整理

    [试题描述] 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个),请将该节点从单链表中删除. 程序:

最新文章

  1. 跳出数据计算拯救人工智能之分布式逻辑
  2. JavaScript性能优化 DOM编程
  3. 新浪短链api java_php调用新浪短链接API的方法
  4. Fuzzy c-means (FCM)聚类算法
  5. 单点登录总结(域名内与跨域名)
  6. 为什么Java不允许super.super.method();
  7. 【LeetCode笔记】46. 全排列(Java、DFS回溯、队列)
  8. mysql的主从(AB)复制
  9. 华为设备网络故障排错实验
  10. 扎心实战案例:麻(shi)雀(zhan)虽小,五脏俱全
  11. 怎么判断间隙过渡过盈配合_圆柱销有2个标准,选型注意材料和热处理,特别是销孔的配合关系...
  12. python如何制作一个任意列表_我要悄悄学Python之列表(一)
  13. 3D美术14——max——fbx导入max后直接生成bip人形骨骼插件
  14. Java的随机数原理
  15. netty pipeline 执行顺序解读
  16. 固态变 SATAFIRM S11
  17. jQuery中的基本选择器,id,class,元素,通用
  18. 从现在,看未来---Linux Kernel 未来发展方向
  19. 盘点最常用的几款linux服务器管理面板
  20. rk3288 android7.1 蓝牙传送文件失败

热门文章

  1. php pdo exec,PDO::exec
  2. java中a 和 a_Java中的a++和++a的区别 | 学步园
  3. 布局篇(1)—If you love css …
  4. linux、mysql、nginx、tomcat 环境下压力测试的主要调试参数
  5. artDialog双击会关闭对话框的修改
  6. Java定时任务的三种实现方法
  7. lduan server 2012 RMS 群集安装 上(十四)
  8. centos 6.5 找回root密码的方法
  9. 【权值分块】bzoj1588 [HNOI2002]营业额统计
  10. Acwing:最长回文子串