删除排序链表中的重复元素
题目:
注意:这道题由于已经被排好序,所以简单许多,如果没有注意到已经是排序好的,会将问题复杂化。
思路:
1.考虑特殊情况:假如给定单链表为空或只有一个元素,那么直接返回该单链表。
2.一般情况:定义一个指针(ptr)指向单链表的头结点,这样方便我们后续对单链表进行删除工作。因为该链表已经是排序过的,所以重复的元素只可能相邻,因此我们直接比较相邻两个数直接是否重复。
(1)重复,删除该结点。
(2)不重复,指针后移,继续对剩下部分进行相同操作,直到单链表遍历结束。
public ListNode deleteDuplicates(ListNode head)
{
if(head==null||head.next==null)
return head;
ListNode ptr=head;
while(ptr.next!=null)
{
if(ptr.val==ptr.next.val)
ptr.next=ptr.next.next;
else
ptr=ptr.next;
}
return head;
}
扩展:
假如给定链表不是排序好的,那么,重复元素不一定会在相邻位置 。一种比较容易想到的思路是双重循环。时间复杂度是O(n2)。另一种思路是先将链表排序O(nlogn),再合并。