C++腾讯后端实习笔试:旋转单向链表使旋转后字典序最小

旋转单向链表使字典序最小

字典序:对于两个序列a,b 若存在一个j使得对于所有的 i < j , 都有 ai= bi,且aj < bj 那么a序列的字典序小于b序列的字典序。
如输入5 2 3 4 1 那么输出 1 5 2 3 4

因为无论这个数字序列如何排列,其第一个值b1(5,2,3,4) 一定大于a1(1)。

同理输入2 2 5 2 2 输出2 2 2 2 5
输入2 2 5 2 3 输出2 2 5 2 3
输入3 4 5 1 2 输出1 2 3 4 5

笔试中给出题目的描述很多很杂,很容易读不懂题,但考察的点主要有两个:

旋转链表:

通过将单向链表连接成为循环链表完成。

调节连续的数字序列使其字典序最小

很容易想到,使数字序列中的最小值排在第一个就可以了。

但是有多个最小值呢,比如 输入 2 5 2 3 8 此时有两个最小值其后面的元素分别是3和5,那显然2 3开头的是最小字典序。则输出应该是2 3 2 5 8
也就是说,如果有多个最小值,我们去比较每个最小值后一位的值,如果后一位再相同,就再去判断后一位。

解题思路:

  1. 遍历链表找最小值
  2. 将最小值的节点的地址存入数组
  3. 比较各个最小值节点的后面的值
  4. 将链表闭合
  5. 将找到的最小值节点设为头结点,将头结点上一个节点断开

代码:

NodeList* defFirMin(NodeList* nl1, NodeList* nl2)
{
   
	NodeList* curn1 = nl1;
	NodeList* curn2 = nl2;
	// 若两个相同值的节点碰撞,说明他们的最小字典序相同
	while (curn1 != nl2)
	{
   
		if 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值