代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点、 面试题 02.07. 链表相交、142.环形链表II

58 阅读1分钟

代码随想录算法训练营第四天 | 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步后一定会在环的入口相遇。