剑指 Offer II 021. 删除链表的倒数第 n 个结点
双指针,一前一后,中间差n,这样当前指针结点到最后的时候需要删除的就是后指针结点
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* p,*q;
ListNode pre;
pre.next=head;
if(head->next==NULL&&n==1) return NULL;
p=⪯q=p;
int ap=0;
int aq=0;
while(p->next){
p=p->next;
ap++;
if(ap>n){
q=q->next;
aq++;
}
if(p->next==NULL){
ListNode* tem=q->next;
q->next=tem->next;
delete(tem);
break;
}
}
return pre.next;
}
};
剑指 Offer II 022. 链表中环的入口节点
快慢指针,两者之间的关系参考https://leetcode-cn.com/problems/c32eOV/solution/lian-biao-zhong-huan-de-ru-kou-jie-dian-vvofe/,不再做解释
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode *slow = head, *fast = head;
while (fast != nullptr) {
slow = slow->next;
if (fast->next == nullptr) {
return nullptr;
}
fast = fast->next->next;
if (fast == slow) {
ListNode *ptr = head;
while (ptr != slow) {
ptr = ptr->next;
slow = slow->next;
}
return ptr;
}
}
return nullptr;
}
};
剑指 Offer II 023. 两个链表的第一个重合节点
这题与之前做过的一题一致,两个指针遍历两个头节点
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA||!headB) return NULL;
ListNode *p=headA;ListNode *q=headB;
while(p!=q){
if(!p) p=headB;
else p=p->next;
if(!q) q=headA;
else q=q->next;
}
return p;
}
};