面试题 02.01.移除重复节点
题目描述
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示
- 链表长度在[0, 20000]范围内。
- 链表元素在[0, 20000]范围内。
示例代码
Java 循环枚举/HashSet
import java.util.*;
public class Question02_01 {
public static void main(String[] args) {
Solution s = new Solution();
ListNode head01 = new ListNode(1,new ListNode(2,new ListNode(3,new ListNode(3,new ListNode(2,new ListNode(1))))));
ListNode result01 = s.removeDuplicateNodes(head01);
for (int i = 0; result01 != null; result01 = result01.next) {
System.out.print(result01.val);
}
System.out.println();
ListNode head02 = new ListNode(1,new ListNode(1,new ListNode(1,new ListNode(1,new ListNode(2)))));
ListNode result02 = s.removeDuplicateNodes(head02);
for (int i = 0; result02 != null; result02 = result02.next) {
System.out.print(result02.val);
}
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
ListNode(int x,ListNode next){
val = x;
this.next = next;
}
}
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
ListNode pi = head;
ListNode pj;
while (pi != null) {
pj = pi;
while (pj.next != null) {
if (pj.next.val == pi.val)
pj.next = pj.next.next;
else
pj = pj.next;
}
pi = pi.next;
}
return head;
}
}
class Solution02_01_01 {
public ListNode removeDuplicateNodes(ListNode head) {
if (head == null)
return head;
Set<Integer> occurred = new HashSet<Integer>();
occurred.add(head.val);
ListNode p = head;
while (p.next != null) {
ListNode cur = p.next;
if (occurred.add(cur.val))
p = p.next;
else
p.next = p.next.next;
}
p.next = null;
return head;
}
}
Java 循环枚举 提交结果
执行用时:399 ms, 在所有 Java 提交中击败了8.47% 的用户
内存消耗:39.1 MB, 在所有 Java 提交中击败了91.71% 的用户
Java HashSet 提交结果
执行用时:5 ms, 在所有 Java 提交中击败了89.88% 的用户
内存消耗:39.7 MB, 在所有 Java 提交中击败了52.05% 的用户