【leetcode 24】两两交换链表中的节点

关于cur指向
cur指向反转结点的前一结点
eg1 : (1,2) cur->dummyHead
eg2 : (3,4) cur->2
关于终止条件
奇数 偶数
操作顺序
初始时,cur指向虚拟头结点,然后进行如下三步:
操作之后,链表如下:
看这个可能就更直观一些了:

代码
伪代码

cpp
dummyHead -> next = head;
cur = dummyHead;
while(cur -> next != NULL && cur ->next -> next != NULL){//要注意这个顺序,反过来发生空指针异常
temp = cur ->next;
temp1 = cur ->next ->next ->next;
cur ->next = cur ->next ->next;
cur ->next ->next = temp;
temp ->next = temp1;
cur = cur ->next ->next;
}
return dummyHead ->next;
代码
cpp
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
dummyHead->next = head; // 将虚拟头结点指向head,这样方便后面做删除操作
ListNode* cur = dummyHead;
while(cur->next != nullptr && cur->next->next != nullptr) {
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; // cur移动两位,准备下一轮交换
}
ListNode* result = dummyHead->next;
delete dummyHead;
return result;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)
【leetcode 160】相交链表

cpp
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* curA = headA;
ListNode* curB = headB;
int lenA = 0;
int lenB = 0;
while(curA){
lenA++;
curA = curA ->next;
}
while(curB){
lenB++;
curB = curB -> next;
}
ListNode* longList = headA;
ListNode* shortList = headB;
if(lenB > lenA){
longList = headB;
shortList = headA;
}
int gap = abs(lenA - lenB);
while(gap--){
longList = longList -> next;
}
while(longList){
if(longList == shortList){
return longList;
}
longList = longList ->next;
shortList = shortList -> next;
}
return NULL;
}
};