一,输入一个链表,求链表是否带环?(快慢指针,快指针一次走2步,慢指针一次走一步,若带环肯定会相遇)
#include<stdlib.h>
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head==NULL || head->next==NULL)
return false;
ListNode *first = head;
ListNode *second = head;
while(first!=NULL&&second!=NULL&&second->next!=NULL)
{
first = first->next;
second = second->next->next;
if(first==second)
return true;
}
return false;
}
};
二,在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead==NULL ||pHead->next==NULL)
return pHead;
if(pHead->val==pHead->next->val)
{
ListNode * cur = pHead->next;
while(cur!=NULL&&cur->val==pHead->val)
{
cur = cur->next;
}
return deleteDuplication(cur);
}
else
{
pHead->next = deleteDuplication(pHead->next);
return pHead;
}
}
};
三,输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==NULL)
return pHead2;
else if(pHead2==NULL)
return pHead1;
ListNode * Mer_Head = NULL;
if(pHead1->val>pHead2->val)
{
Mer_Head = pHead2;
Mer_Head->next = Merge(pHead1,pHead2->next);
}
else
{
Mer_Head = pHead1;
Mer_Head->next = Merge(pHead1->next,pHead2);
}
return Mer_Head;
}
};