class Solution {
public:
ListNode* detectCycle(ListNode* head) {
ListNode *fast = head, *slow = head;
while (fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
if (fast == slow) {
ListNode* index1 = fast;
ListNode* index2 = head;
while (index1 != index2) {
index1 = index1->next;
index2 = index2->next;
}
return index1;
}
}
return NULL;
}
};
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *A = headA, *B = headB;
while (A != B) {
A = A != nullptr ? A->next : headB;
B = B != nullptr ? B->next : headA;
}
return A;
}
};
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy=new ListNode(0,head);
ListNode* r=dummy,*l=dummy;
while(n>=0)
{
r=r->next;
n--;
}
while(r)
{
r=r->next;
l=l->next;
}
l->next=l->next->next;
return dummy->next;
}
};
以上几道方法都利用了数学思维
可利用递归做,也可以利用迭代,创造虚拟头结点减少讨论情况
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if (head == nullptr || head->next == nullptr)
return head;
ListNode* node=head->next;
head->next=swapPairs(node->next);
node->next=head;
return node;
}
};