两两交换链表中的结点-力扣24

41 阅读1分钟

两两交换链表中的结点-力扣24

初始时1->2->3->4->5->6->7

递归出口:没有结点或只有一个结点

初始时交换1->2的位置,最终2会成为返回的首结点,1用来指向后面的结点。之后递归式的处理后续的结点即可。

/**
 * 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) {
        if(head == nullptr || head->next == nullptr) 
            return head; // 没有结点和只有一个结点时无法交换

        // 1->2->3->4,翻转后 2->1->3->4,2成为最终返回的头结点
        ListNode *newHead = head->next;

        //传入3->4,递归操作
        ListNode *nextHead = swapPairs(newHead->next);

        //在这里才正式交换1,2的位置
        head->next = nextHead;
        newHead->next = head;
        
        return newHead;
    }
};

时间复杂度:O(n)O(n)

空间复杂度:O(1)O(1)