[LeetCode] 82. Remove Duplicates from Sorted List II
Given the head
of a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list. Return the linked list sorted as well.
Example 1:
Input: head = [1,2,3,3,4,4,5] Output: [1,2,5]
Example 2:
Input: head = [1,1,1,2,3] Output: [2,3]
Constraints:
- The number of nodes in the list is in the range
[0, 300]
. -100 <= Node.val <= 100
- The list is guaranteed to be sorted in ascending order.
删除排序链表中的重复元素II。
题意跟版本一很接近,唯一的区别是,版本一是请你删除重复元素,使得 output 里面每个元素只出现一次。版本二是请你删除所有出现超过一次的元素。思路是需要创建一个 dummy 节点,放在所有需要遍历的节点之前,遍历的时候,找是否有两个节点的 val 相同,找到后记下这个 val。再往后遍历的时候,只要遇到这个 val 就跳过。
比如第一个例子好了,当cur遍历到2的时候,cur.next == 3, cur.next.next == 3;此时记录sameVal = cur.next.val。接着从cur.next开始判断,只要cur.next.val == 3的时候,就cur.next = cur.next.next。
如果是比如一开始遍历到1的时候好了,此时cur.next == 2,cur.next.next == 3,两者并不相等,所以直接就遍历下一个节点,cur = cur.next。
时间O(n)
空间O(1)
JavaScript实现
1 /** 2 * @param {ListNode} head 3 * @return {ListNode} 4 */ 5 var deleteDuplicates = function(head) { 6 // corner case 7 if (head === null || head.next === null) return head; 8 9 // normal case 10 let dummy = new ListNode(0); 11 dummy.next = head; 12 let cur = dummy; 13 while (cur.next !== null && cur.next.next !== null) { 14 if (cur.next.val === cur.next.next.val) { 15 let sameVal = cur.next.val; 16 while (cur.next !== null && cur.next.val === sameVal) { 17 cur.next = cur.next.next; 18 } 19 } else { 20 cur = cur.next; 21 } 22 } 23 return dummy.next; 24 };
Java实现
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 class Solution { 10 public ListNode deleteDuplicates(ListNode head) { 11 // corner case 12 if (head == null || head.next == null) { 13 return head; 14 } 15 16 // normal case 17 ListNode dummy = new ListNode(0); 18 dummy.next = head; 19 // 注意这里cur是从dummy开始 20 ListNode cur = dummy; 21 while (cur.next != null && cur.next.next != null) { 22 if (cur.next.val == cur.next.next.val) { 23 int sameVal = cur.next.val; 24 while (cur.next != null && cur.next.val == sameVal) { 25 cur.next = cur.next.next; 26 } 27 } else { 28 cur = cur.next; 29 } 30 } 31 return dummy.next; 32 } 33 }
相关题目
83. Remove Duplicates from Sorted List
82. Remove Duplicates from Sorted List II