题目:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
分析:
两种做法,
1:递归,把next的递归结果作为当前节点的next
2:遍历,创建一个新链表,顺序遍历老链表,把不重复的加到新链表后面去
代码:
思路1(非原创):
public ListNode deleteDuplicates(ListNode head) {
//baseCase
if (head == null || head.next == null) {
return head;
}
ListNode next = head.next;
//如果是这种情况
// 1 --> 1 --> 1 --> 2 --> 3
// head next
//1.则需要移动next直到出现与当前head.value不相等的情况(含null)
//2.并且此时的head已经不能要了,因为已经head是重复的节点
//--------------else-------------
// 1 --> 2 --> 3
// head next
//3.如果没有出现1的情况,则递归返回的节点就作为head的子节点
if (head.val == next.val) {
//1
while (next != null && head.val == next.val) {
next = next.next;
}
//2
head = deleteDuplicates(next);
} else {
//3
head.next = deleteDuplicates(next);
}
return head;
}
思路2:
public ListNode deleteDuplicates(ListNode head) {
ListNode dummy = new ListNode(0);
ListNode preNode = null;
ListNode currentNode = head;
ListNode lastNode = dummy;
while (currentNode != null) {
if (isNotDuplicates(currentNode, preNode)) {
lastNode.next = new ListNode(currentNode.val);
lastNode = lastNode.next;
}
preNode = currentNode;
currentNode = currentNode.next;
}
return dummy.next;
}
private boolean isNotDuplicates(ListNode currentNode, ListNode preNode) {
if (preNode != null && currentNode.val == preNode.val) {
return false;
}
if (currentNode.next != null && currentNode.val == currentNode.next.val) {
return false;
}
return true;
}
效率:
总结:
思路1找到路子了,没有做出来。对链表熟练度不够。思路二自己ac了,还可以。