LeetCode:删除排序链表中的重复元素

259 阅读1分钟

一、题目描述

二、思路分析

2.1 分析

因为链表是有序的,重复的节点的值必然是连续的,所以我们只关心相邻的两个节点的值是不是重复的。定义一个 cur 指针,指向链表的头节点。如果 cur.val 与 cur.next.val 相等(),那么让 cur.next 指向它的下一个节点的下一个 cur.next.next。否则 cur 后移一下,直到 cur 或者 cur.next 为空时。相同的思路实现还有递归版本。一直对递归畏惧,直到看到了题解里一个大佬留下的博客,终于对递归有点感觉了。注意一下链表为空或者只有一个节点的时候。

2.2 图解

三、题解

删除排序链表中重复元素的实现

  • 迭代
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode cur = head;
    
        while (cur != null && cur.next != null) {
            if (cur.val == cur.next.val) {
                cur.next = cur.next.next;
            } else {
                cur = cur.next;
            }
        }
        return head;
    }
}
  • 递归
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
    	// 1.递归的终止条件
        if (head == null || head.next == null) {
            return head;
        }
        // 2.找返回值:应该给上一级返回的信息
        head.next = deleteDuplicates(head.next);
        // 3.本级递归应该做什么
        if (head.val == head.next.val) {
            head.next = head.next.next;
        }
        return head;
    }
}