Description
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Example 1:
Input:
1->2->3->3->4->4->5
Output:
1->2->5
Example 2:
Input:
1->1->1->2->3
Output:
2->3
分析
题目的意思是:给定一个链表,移除重复的节点。
- 类似于快慢指针,快指针寻找重复的结点,慢指针指向未重复链表的末尾
C++实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* dummy=new ListNode(-1);
dummy->next=head;
ListNode* slow=dummy;
ListNode* fast=head;
while(fast){
while(fast->next&&fast->val==fast->next->val){
fast=fast->next;
}
if(slow->next!=fast){
slow->next=fast->next;
fast=slow->next;
}else{
slow=slow->next;
fast=fast->next;
}
}
return dummy->next;
}
};
Python实现
原来的C++版本写的难以理解,下面的写法容易理解的多。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode(-1)
dummy.next = head
cur = dummy
while cur.next and cur.next.next:
if cur.next.val == cur.next.next.val:
x = cur.next.val
while cur.next and cur.next.val==x:
cur.next = cur.next.next
else:
cur = cur.next
return dummy.next