24.两两交换链表中的节点

本文介绍了如何使用迭代方式合并链表,先将链表按奇偶分组,然后合并为一个有序链表。同时,展示了如何通过位运算高效地创建奇数链表和偶数链表。最后,通过`merge`和`swapPairs`函数实现链表操作技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ListNode *merge(ListNode *odd, ListNode *even){
        
        ListNode dummy, *tail = &dummy;
        
        bool isEven = true;
        
        while (odd || even) {
            //奇数链表为空 或者 偶数标记 偶数链表不为空 那就在尾部添加偶数结点
            if (!odd || isEven && even) {
                tail->next = even;
                even = even->next;
            }else{
                tail->next = odd;
                odd = odd->next;
            }
            //尾部指针更新
            tail = tail->next;
            //奇偶变化
            isEven = !isEven;
        }
        // 注意:这里一定要记得把tail.next设置为空。
        // 虽然这个题可能并不需要,但是应该养成收尾的好习惯
        tail->next = nullptr;
        return dummy.next;
        
    }
    
    ListNode* swapPairs(ListNode* head) {

        ListNode odd, *odd_tail = &odd;
        ListNode even, *even_tail = &even;
        
        auto p = head;
        int idx = 1;
        while (p) {
            auto back = p->next;
            //利用位运算提高效率 分别生成奇偶两个列表
            if (idx & 0x01) {
                odd_tail->next = p;
                odd_tail = p;
            }else{
                even_tail->next = p;
                even_tail = p;
            }
            p = back;
            idx ++;
        }
        // 注意:这里一定要记得把tail.next设置为空。
        // 虽然这个题可能并不需要,但是应该养成收尾的好习惯
        odd_tail->next = nullptr;
        even_tail->next = nullptr;
        return merge(odd.next, even.next);
    }

题目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值