Remove Duplicates from Sorted List

  • Easy
  • tag: recursion
  • 类似: reverse list, 所有list 的 recursion

Given a sorted linked list, delete all duplicates such that each element appear only once.

idea 1

  • 这是我的写法. 很简单的思路, 因为有可能修改头结点. 例如: 1-1-1-1-1, val = 1. 此时返回[].
  • 所以使用dummy node.
  • 因为要删除节点, 所以必须知道prev node. 所以也使用一个global var: prev.
  • algs很简单: 如果当前node的值等于val, 那么prev就跳过当前node. 否则prev update为当前node.
  • 代码如下:
public ListNode removeElementsTTT(ListNode head, int val) {
    ListNode dummy = new ListNode(0);
    dummy.next = head;
    ListNode pre = dummy;
    while (head != null) {
      if (head.val == val) {
        pre.next = head.next;
      }
      else {
        pre = head;
      }
      head = head.next;
    }
    return dummy.next;
  }

idea 2

  • 凡是list, tree, graph这种本身就是recursion build的数据结构肯定是有recursion解法的. 当然这题也不例外.
  • recursion处理list, 特别是singly list的优势在于recursion的stack自动相当于保存了prev节点.
  • 所以这里也是很优美的递归写法, 代码如下: 参考的discuss: 3 line recursion
public ListNode removeElements(ListNode head, int val) {
    if (head == null) {
      return null;
    }
    head.next = removeElements(head.next, val);
    return head.val == val ? head.next : head;
  }