题目描述:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
思路:
用一个空指针指向链表头,然后通过 slow 和 fast 一快一慢实现删除重复数字。
通过内层的while 循环可以解决多个(2个和2个以上)数字重复的情况,然后通过对比 slow->next 和 fast 是否相等来判断fast 是否移动过,若移动过则跳过重复的数字。
具体语句可以看代码注释。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
// 快慢指针
//
struct ListNode* deleteDuplicates(struct ListNode* head){
if(head == NULL) return head;
struct ListNode* slow;
struct ListNode* fast;
struct ListNode* t_head;
t_head=(struct ListNode*)malloc(sizeof(struct ListNode));
t_head->val = 0;
t_head->next = NULL;
t_head->next = head;
slow = t_head;
fast = t_head->next;
while(fast != NULL)
{
while(fast->next!=NULL && slow->next->val==fast->next->val)
fast = fast->next; // 解决2个或2个以上相等的情况,通过fast—>next 只留下一个重复的数字,重复数字在后面else中跳过
if(slow->next == fast)//若没有移动 fast 指针,此时low 加 1
slow = fast;
else
slow->next = fast->next;//若移动了,此时需要跳过重复的数字,所以fast->next
fast = fast->next;
}
return t_head->next;
}

本文介绍了一种使用快慢指针技巧从排序链表中删除重复数字的算法。通过一个空指针指向链表头,利用slow和fast指针一快一慢遍历链表,仅保留没有重复出现的数字,有效解决了链表去重问题。
472

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



