代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点、 面试题 02.07. 链表相交、142.环形链表II
24. 两两交换链表中的节点
题目链接:24. 两两交换链表中的节点
- 当使用left mid right做交换时,要知道 mid 已经变成最右侧节点,相当于已经走了一步,只需要再走一步
-
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode* dummyHead = new ListNode(); dummyHead->next = head; ListNode* mid = dummyHead->next; ListNode* left = dummyHead; while(left->next!=nullptr && left->next->next!=nullptr) { // cout << "!" <<endl; ListNode* right = mid->next; left->next = right; mid->next = right->next; right->next = mid; mid = mid->next; // mid 已经变成最右侧节点,相当于已经走了一步,只需要再走一步 left = left->next->next; } return dummyHead->next; //记住返回dummyHead.next!! } };
19.删除链表的倒数第N个节点
题目链接:19.删除链表的倒数第N个节点
ListNode* fast = dummyHead;
ListNode* slow = dummyHead;
while(n > 0) {
fast = fast->next;
n--;
}
面试题 02.07. 链表相交
题目链接:面试题 02.07. 链表相交
// 方法一:循环两个链表
// 一定要注意头尾节点是否为null
// 方法二:求出长度后长链先出发,之后共同到达的节点即为相交节点
142.环形链表II
题目链接:142.环形链表II
- 在环里相遇之后,将其中一个点从起点出发,k-m步后一定会在环的入口相遇。