作者:disappearedgod
时间:2014-4-18
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.
Definition for singly-linked list.
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
解法
几个不同想法:
- 用循环列表来删除
- 先扫描一遍记住要删除的元素,然后再扫一遍删除
解释:这两个方法前一个行不通,因为不是去重而是删去重复的所有数字,故基于频率的循环删除不可以。后者太麻烦,虽然可能只用一个指针解决问题,但是要多一次循环并且需要更多的空间。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null||head.next==null)
return head;
ListNode p = head;
ListNode dummy = new ListNode(Integer.MIN_VALUE);
ListNode pre = dummy;
int del = Integer.MIN_VALUE;
while(p!=null&&p.next!=null){
if(p.val == p.next.val){
del = p.val;
while(p.val == del){
p=p.next;
if(p==null)
return dummy.next;
}
}
else{
pre.next = p;
pre = pre.next;
p=p.next;
pre.next = null;
}
}
pre.next = p;
return dummy.next;
}
}
本文介绍了一种有效的算法,用于删除已排序链表中的所有重复节点,仅保留唯一值。通过一个示例性的Java解决方案展示了如何实现该功能,并提供了完整的代码示例。
222

被折叠的 条评论
为什么被折叠?



