/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
链表求是否有环并求出环的交点(LeetCode142)
class Solution {
public:
//思路:快慢指针法
ListNode *detectCycle(ListNode *head) {
if(!head || !head->next) return NULL;
ListNode *s=head;
ListNode *f=head;
while(f && f->next) {
s=s->next;
f=f->next->next;
if(f==s) break;
}
if(f==s) {
s=head;
while(f!=s) {
f=f->next;
s=s->next;
}
return f;
}
else return NULL;
}
};
判断两个链表是否相交并求出交点,没有输出NULL(LeetCode160)
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA || !headB) return NULL;
ListNode *a=headA, *b=headB;
while(a!=b) {
a=a?a->next:headB;
b=b?b->next:headA;
}
return a;
}
};
翻转链表(LeetCode206)
class Solution {
public:
//思路:三个指针法
ListNode* reverseList(ListNode* head) {
ListNode *p=head, *pre=NULL, *t;
while(p) {
t=p->next;
p->next=pre;
pre=p;
p=t;
}
return pre;
}
};
判断链表是否为回文链表,需O(N)时间复杂度和O(1)空间复杂度(LeetCode234)
class Solution {
public:
void fanzhuan(ListNode* p, ListNode *p_pre) {
ListNode* t, *pre=NULL;
while(p) {
t=p->next;
p->next=pre;
pre=p;
p=t;
}
p_pre->next=pre;
}
//思路:快慢指针法,找到中点。之后将后半段翻转链表,然后从头和中点位置一一判断是否相等。
bool isPalindrome(ListNode* head) {
if(!head || !head->next) return true;
ListNode *f=head, *s=head;
while(f->next&&f->next->next) {
f=f->next->next;
s=s->next;
}
fanzhuan(s->next, s);
s=s->next;
while(s) {
if(head->val!=s->val) return false;
head=head->next;
s=s->next;
}
return true;
}
};