描述:

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

示例 1:

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

示例 2:

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

 

解答:

1.直接求解

通过将结点的值与它之后的结点进行比较来确定它是否为重复结点。如果它是重复的,我们更改当前结点的 next 指针,以便它跳过下一个结点并直接指向下一个结点之后的结点。

public ListNode deleteDuplicates(ListNode head) {
    ListNode current = head;
    while (current != null && current.next != null) {
        if (current.next.val == current.val) {
            current.next = current.next.next;
        } else {
            current = current.next;
        }
    }
    return head;
}

2.从左到右  用两个节点连接起来

public ListNode deleteDuplicates(ListNode head) {
		if (head == null) {
			return null;
		}
		ListNode pre = new ListNode(-1);
		ListNode mostLeft = pre; // 记录虚拟位置 最左边的
		ListNode cur = head;
		while (cur != null) {
			while (cur.next != null && cur.val == cur.next.val) {
				cur = cur.next; //  跳过重复的 来到下一个
			}

			pre.next = cur; // 连接起来
			// cur和pre分别来到它们下一个位置
			cur = cur.next;
			pre = pre.next;
		}
		return mostLeft.next; //返回头节点
	}