標籤:leetcode 單鏈表 雙指標 演算法 遍曆
problem:
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.
Hide Tags Linked List題意:將單鏈表的重複元素刪去
thinking:
(1)單鏈表順序遍曆,時間複雜度O(n),這道題不難
(2)我採用雙指標法遍曆,用前驅指標儲存最近出現的非重複結點,方便重複資料刪除的結點,一次提交AC
code:
/** * 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) { if(head==NULL || head->next==NULL) return head; if(head->val==head->next->val)//從頭結點開始出現重複元素 { ListNode *tmp=head;; while(tmp->next && tmp->val==tmp->next->val) { tmp=tmp->next; } return deleteDuplicates(tmp->next); } ListNode *p=head;//左指標 ListNode *q=p; //右指標 ListNode *pre=p; //前驅指標 while(p!=NULL) { q=p->next; //右指標初始化 if(q==NULL) return head; if(p->val!=q->val) //不相等,同時前進 { pre=p; //前驅指標儲存最後一次出現的非重複結點 p=p->next; q=q->next; } else //相等 ,右指標前進 { while(q!=NULL && q->val==p->val) { q=q->next; } pre->next=q; //重複資料刪除元素 p=q; //更新左指標 } } return head; }};
leetcode || 82、Remove Duplicates from Sorted List II