leetcode708-排序的循环链表(刷题记录)

该文章描述了一个编程问题,要求编写一个函数在循环单调非递减列表中插入一个新元素,保持列表的循环升序。首先检查列表是否为空,然后遍历找到最值,根据值的关系决定插入位置。如果最大值和最小值相等,插入任何位置都行;否则,找到有序链表的结束点,并根据插入值与最值的关系插入新节点。

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

题目描述:

给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 insertVal ,使这个列表仍然是循环升序的。

给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针。

如果有多个满足条件的插入位置,可以选择任意一个位置插入新的值,插入后整个列表仍然保持有序。

如果列表为空(给定的节点是 null),需要创建一个循环有序列表并返回这个节点。否则。请返回原先给定的节点。

示例:

 

代码:

class Solution {
public:
    Node* insert(Node* head, int insertVal) {
        Node* newNode = new Node(insertVal);
        if (!head) {
            newNode->next = newNode;
            return newNode;
        }
        Node* tmp = head;
        int maxV = tmp->val, minV = tmp->val;
        while (tmp->next != head) {
            tmp = tmp->next;
            maxV = max(tmp->val, maxV);
            minV = min(tmp->val, minV);
        }
        if (maxV == minV){
            newNode->next = tmp->next;
            tmp->next = newNode;
            return head;
        } else {
            if (insertVal <= minV || insertVal >= maxV) {
                while (tmp) {
                    if (tmp->val == maxV && tmp->next->val == minV) {
                        newNode->next = tmp->next;
                        tmp->next = newNode;
                        return head;
                    }
                    tmp = tmp->next;
                }
            } else {
                while (tmp) {
                    if (tmp->val <= insertVal && insertVal <= tmp->next->val) {
                        newNode->next = tmp->next;
                        tmp->next = newNode;
                        return head;
                    }
                    tmp = tmp->next;
                }
            }
        }
        return head;
    }
};

理解:

首先创建待插入的节点newNode,当head为空时,直接返回newNode即可。

由于我们需要返回原本的头节点,因此我们使用变量tmp转存head,并复用tmp来充当游标进行遍历。

我们先对链表进行一次完整遍历,获取链表的最值minV和maxV,由于链表是循环的,我们需要使用tmp->next != head作为我们循环的结束条件,含义为回到链表开头。

此时根据最大值和最小值是否相等(即整段链表值是否一致)来进行情况讨论:

  • 若满足maxV=minV,此时目标节点newNode插入在哪个位置都满足条件,我们直接将其与head关联即可;
  • 若不满足maxV=minV,此时我们先对链表进行一次遍历,找到有序链表的结束点(结束点的定义为:当前节点值为最大值,下一节点为最小值。即为有序链表分割位置的左端点),在根据『插入值insertval是否为新链表的最值』进行分情况讨论:
    • 若满足x>=maxV或x<=minV,说明目标节点newNode插入分割位置即可
    • 若不满足上述两条件,需要从分割位置出发,找到目标位置,即满足tmp->val<=x && x <= tmp->next->val的位置。

参考学习:力扣

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值