class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* cur1 = headA;
ListNode* cur2 = headB;
int len1 = 0, len2 = 0;
while(cur1 != NULL) {
cur1 = cur1->next;
++len1;
}
while(cur2 != NULL) {
cur2 = cur2->next;
++len2;
}
cur1 = headA, cur2 = headB;
if(len2 > len1) {
swap(len1, len2);
swap(cur1, cur2);
}
int gap = len1 - len2;
while(gap--) cur1 = cur1->next;
while(cur1 != NULL) {
if(cur1 == cur2) return cur1;
cur1 = cur1->next;
cur2 = cur2->next;
}
return 0;
}
};
方法:双指针(快慢指针)
$时间复杂度O(n+m), 空间复杂度O(1)
19. 删除链表的倒数第 N 个结点
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* fast = dummyHead;
ListNode* slow = dummyHead;
while(n-- && fast != NULL) fast = fast->next;
fast = fast->next;
while(fast) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
head = dummyHead->next;
delete dummyHead;
return head;
}
};
方法:双指针(快慢指针)
$时间复杂度O(n), 空间复杂度O(1)
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* cur = dummyHead;
while(cur->next && cur->next->next) {
ListNode* tmp = cur->next;
ListNode* tmp1 = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = tmp;
cur->next->next->next = tmp1;
cur = cur->next->next;
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};
$时间复杂度O(n), 空间复杂度O(1)
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
while(fast != NULL && fast->next != NULL) {
fast = fast->next->next;
slow = slow->next;
if(slow == fast) {
ListNode* idx1 = fast;
ListNode* idx2 = head;
while(idx1 != idx2) {
idx1 = idx1->next;
idx2 = idx2->next;
}
return idx1;
}
}
return NULL;
}
};
方法:双指针(快慢指针)
$时间复杂度O(n), 空间复杂度O(1)