LeetCode 1721. Swapping Nodes in Linked List

Page content

どうも、たくチャレ(@takuchalle)です。

LeetCode 1721Swapping Nodes in Linked Listを解きました。

設問

与えられたLinked Listの前からk番目の要素と後ろからk番目の要素を入れ替える問題。 Linked Listのサイズが与えられないので、後ろからk番目の要素をどうするかが問題のキモです。

一度Linked Listを全て走査すればサイズがわかりますが、2回走査することになるので、なるべく1回で済むように実装しました。 変数leftを前からk番目の要素のポインタ、変数rightを後ろからk番目の要素のポインタとしています。

leftは難しいことはなく、rightk分ずらしてずらして更新していくことで、所望の要素を得ることができる。

計算量はO(N)で、消費メモリはO(1)になります。

class Solution {
   public:
    ListNode* swapNodes(ListNode* head, int k) {
        ListNode *left = nullptr, *right = head;

        int count = 0;
        int r_count = k * -1; // k分ずらしておく
        for (ListNode* n = head; n != nullptr; n = n->next) {
            if (++count == k) left = n;
            if (++r_count >= 1) right = right->next;
        }

        auto tmp = left->val;
        left->val = right->val;
        right->val = tmp;

        return head;
    }
};