zoukankan      html  css  js  c++  java
  • 83—删除链表中重复的元素

    题目

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

    示例 1:
    输入: 1->1->2
    输出: 1->2
    示例 2:

    输入: 1->1->2->3->3
    输出: 1->2->3

    有两种解法,一种是迭代,使用双指针,另一种是递归。
    双指针就是定义快慢指针,快指针与慢指针指向的值进行比较,如果两个的val相等代表两个元素重复,将慢指针的next指向快指针的next,如果不相等,两个指针都往后移动,直到快指针为空。

    递归解法:结束条件时head为null或者head.next为null,递归的返回值代表以head开头的链表是一个有序不重复的链表,所以,如果两个元素重复,最终返回head,如果不重复,继续递归下一个节点;

    代码

    //快慢指针解法
        public ListNode deleteDuplicates(ListNode head) {
            if(head==null||head.next==null) return head;
            ListNode pre = new ListNode(0);
            pre.next = head;
            ListNode cur = head.next;
            ListNode slow = head;
            while(cur!=null){
                if(slow.val==cur.val){
                    //如果相邻的两个节点的值相等,说明是重复元素,慢指针指向的节点的next=他next.next
                    //之后快指针往后移动
                    slow.next = cur.next;
                    cur = cur.next;
                }else{
                    //如果不相等,快指针和慢指针都往后移动
                    slow = slow.next;
                    cur = cur.next;
                }
            }
            return pre.next;
        }
    

    递归

     //递归解法
        public ListNode deleteDuplicates(ListNode head) {
            if(head==null||head.next==null) return head;
            if (head.val == head.next.val){
                head = deleteDuplicates(head.next);
            }else{
                head.next = deleteDuplicates(head.next);
            }
            return head;
        }
    
  • 相关阅读:
    NOIP2018 游记
    HDU1556 敌兵布阵
    BZOJ 1032 [JSOI2007]祖码Zuma
    BZOJ 1068 [SCOI2007]压缩
    BZOJ 1090 [SCOI2003]字符串折叠
    BZOJ 1260 [CQOI2007]涂色paint
    BZOJ 1055 [HAOI2008]玩具取名
    HDU 5151 Sit sit sit
    HDU 4283 You Are the One
    vue系列8:webpack
  • 原文地址:https://www.cnblogs.com/dataoblogs/p/14121815.html
Copyright © 2011-2022 走看看