【leetcode c++】82 Remove Duplicates from Sorted List II
2015-07-17 23:16
447 查看
Remove Duplicates from Sorted List II
Given a sorted linked list, delete allnodes that have duplicate numbers, leaving only distinct numbers from theoriginal list.
For example,
Given1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return2->3.
又是二号题,刚好是在一号题的下面,就手滑进来做了。跟Remove Duplicates from Sorted 【Array】 II 这题稍微不一样,【Array】 II是要求保留2个重复元素,这题是要求删除凡是重复的元素。
首先考虑需要维护的指针数,如果我们只维护一个指针,判断->val == ->next->val 的话可以的,但是,如果->val == ->next->val成立的话,也就是说,至少,当前元素和下一个元素是需要删除的,只有一个指针的话,删除不了单向链表中当前所指元素(除非从头再扫过来,这样效率就爆炸了)。所以我需要一个辅助的指针,这个指针指向扫描指针的前一个节点(如果有的话),来帮助删除当前节点的情况。当然,还需要一个指针作为返回。
因为剧情需要,我们还需要两个bool变量 isHrad 和 isBad,来标记当前节点是不是‘头’和当前节点是不是该删除。初始化isHrad= true 。isBad = false。我们让head指针向后扫描。记得做越界判断。
我的思路千言万语只化作一张图,一共有6种情况,只有两种情况的指针操作是一样的。
Leetcode的AcceptedSolutions Runtime Distribution
源码:
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* deleteRule(ListNode* head);
ListNode* deleteDuplicates(ListNode* head);
int main()
{
ListNode l1(1);
ListNode* pl1 = &l1;
ListNode l2(2);
ListNode* pl2 = &l2;
ListNode l3(1);
ListNode* pl3 = &l3;
pl1->next = pl2;
cout << deleteDuplicates(pl1)->val;
return 0;
}
ListNode* deleteDuplicates(ListNode* head){
//////////////////////////////////////////////////
//leetcode 83
//Remove Duplicates from Sorted List
//////////////////////////////////////////////////
/*
if (NULL == head) return NULL;
ListNode* res = head;
while (head->next)
{
if (head->val == head->next->val)
{
head->next = head->next->next;
}
else
{
head = head->next;
}
}
return res;
*/
Given a sorted linked list, delete allnodes that have duplicate numbers, leaving only distinct numbers from theoriginal list.
For example,
Given1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return2->3.
又是二号题,刚好是在一号题的下面,就手滑进来做了。跟Remove Duplicates from Sorted 【Array】 II 这题稍微不一样,【Array】 II是要求保留2个重复元素,这题是要求删除凡是重复的元素。
首先考虑需要维护的指针数,如果我们只维护一个指针,判断->val == ->next->val 的话可以的,但是,如果->val == ->next->val成立的话,也就是说,至少,当前元素和下一个元素是需要删除的,只有一个指针的话,删除不了单向链表中当前所指元素(除非从头再扫过来,这样效率就爆炸了)。所以我需要一个辅助的指针,这个指针指向扫描指针的前一个节点(如果有的话),来帮助删除当前节点的情况。当然,还需要一个指针作为返回。
因为剧情需要,我们还需要两个bool变量 isHrad 和 isBad,来标记当前节点是不是‘头’和当前节点是不是该删除。初始化isHrad= true 。isBad = false。我们让head指针向后扫描。记得做越界判断。
我的思路千言万语只化作一张图,一共有6种情况,只有两种情况的指针操作是一样的。
Leetcode的AcceptedSolutions Runtime Distribution
源码:
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* deleteRule(ListNode* head);
ListNode* deleteDuplicates(ListNode* head);
int main()
{
ListNode l1(1);
ListNode* pl1 = &l1;
ListNode l2(2);
ListNode* pl2 = &l2;
ListNode l3(1);
ListNode* pl3 = &l3;
pl1->next = pl2;
cout << deleteDuplicates(pl1)->val;
return 0;
}
ListNode* deleteDuplicates(ListNode* head){
//////////////////////////////////////////////////
//leetcode 83
//Remove Duplicates from Sorted List
//////////////////////////////////////////////////
/*
if (NULL == head) return NULL;
ListNode* res = head;
while (head->next)
{
if (head->val == head->next->val)
{
head->next = head->next->next;
}
else
{
head = head->next;
}
}
return res;
*/
/////////////////////////////////////////////////// //leetcode 82 //Remove Duplicates from Sorted List ii /////////////////////////////////////////////////// return deleteRule(head); } ListNode* deleteRule(ListNode* head){ ListNode* res = head; ListNode* pre = NULL; bool isHead = true; bool isBad = false; while (head) { if (head->next && head->val == head->next->val) { isBad = true; if (isHead) { head = head->next; res = head; } else { head->next = head->next->next; } } else { if (isBad && isHead) { head = head->next; res = head; isBad = false; } else if (isBad && !isHead) { pre->next = head->next; head = pre->next; isBad = false; } else if (!isBad && isHead) { pre = head; res = head; head = head->next; isHead = false; } else { pre = head; head = head->next; } } } return res; }
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解
- LeetCode [Day 5] Longest Palindromic Substring 题解
- LeetCode [Day 6] ZigZag Conversion 题解