83.删除排序链表中的重复元素

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

示例 1:

输入: head = [1,1,2]
输出: [1,2]

示例 2:

输入: head = [1,1,2,3,3]
输出: [1,2,3]

提示:

  • 链表中节点数目在范围 [0, 300]
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

Related Topics

  • 链表

题目链接: link

解答

这题不愧是 Easy ,没有什么弯弯绕绕,因此只需要看看下一个和当前这个节点的值一不一样,如果一样就跳过下一个节点,如果不一样就当前节点跳到下一个节点,因为只要一直保持当前节点和下一个节点不一样就能保证只出现一次。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null){
           return null;
        }
        int curVal = head.val;
        ListNode cur = head;
        while(cur!=null){
            curVal = cur.val;
            if (cur.next == null){
                cur = null;
            }else{
                if (curVal == cur.next.val){
                    cur.next = cur.next.next;
                }else{
                    cur = cur.next;
                }
            }
        }
        return head;
    }
}

稍微处理一下边界就可以了。因此一次过了。

这题可以稍微修改一点,比如链表本身是无序的,然后一样的要求,那么我们可以遍历一遍,放到HashMap里或者Set里,然后再排序生成就行了。

又或者保持每个数字第一次出现的相对位置,同样可以用HashMap和Set去处理。