首页 > 其他分享 >Leetcode 328. Odd Even Linked List

Leetcode 328. Odd Even Linked List

时间:2024-10-21 16:47:59浏览次数:7  
标签:Even even head cur nullptr List next odd Linked

我的解法

没有什么需要推理的地方,要注意一开始要让cur走的比odd和even快,否则会导致cur的next被odd和even修改,代码里有注释。

ListNode *oddEvenList(ListNode *head) {
        if (!head) {
            return head;
        }
        ListNode *cur = nullptr, *headofOdd = head,
                 *headofEven = head->next ? head->next : nullptr;
        if (!headofEven) {
            return head;
        }
        ListNode *odd = headofOdd, *even = headofEven;
        cur = head->next->next;
        odd->next = even->next = nullptr;
        if (!cur) {
            odd->next = headofEven;
            return headofOdd;
        }
        int cnt = 3;
        while (cur) {
            std::cout << cur->val << std::endl;
            if (cnt & 1) {
                odd->next = cur;
                odd = cur;
            }  //	奇数
            else {
                even->next = cur;
                even = cur;
            }
            cnt++;
            cur = cur->next;
			// 这两处记得把连接切断,否则会死循环
            odd->next = nullptr;
            even->next = nullptr;
        }
        odd->next = headofEven;
        return headofOdd;
    }
};

但是这个解法非常慢,25ms只超过了5.12%的人,肯定不是正解,故STFW。

正解

因为遍历链表的过程不可能再加速了,所以我们可以确定,问题就出在cnt上,我们加入的计数器导致了速度变慢。
解释都写在注释里。

ListNode *oddEvenList(ListNode *head) {
		// 如果是空的或者只有一个点,就不用翻转了
		if(!head || !head->next) {
			return head;
		}
		auto cur = head, oddHead = cur, oddTail = cur;
		auto evenHead = cur->next, evenTail = evenHead;
		cur = cur->next->next;
		while(cur) {
			oddTail->next = cur;
			oddTail = oddTail->next;
			cur = cur->next;
			if(cur) {
				evenTail->next = cur;
				evenTail = evenTail->next;
				// 这里要记得再跳一下next,因为这个点已经处理过了
				cur = cur->next;
			}
			// 这里之所以不用把odd和even的next都置为nullptr,是因为原来的写法一次只操作奇数或者
			// 偶数当中的一个,奇数轮需要把偶数置空,反之同理,为了省去if判断,每次都全部置空
			// 现在每次都会操作两个,就不需要了
		}
		evenTail->next = nullptr;
		oddTail->next = evenHead;
		return oddHead;
	}

标签:Even,even,head,cur,nullptr,List,next,odd,Linked
From: https://www.cnblogs.com/smartljy/p/18489818

相关文章

  • Java列表list
    List列表创建列表//List的ArrayList实现List<String>list1=newArrayList<>();//List的LinkedList实现List<String>list2=newLinkedList<>();常用方法importjava.util.List;importjava.util.LinkedList;classMain{publicstatic......
  • 17track物流查询平台 last-event-id 参数逆向分析
    声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作......
  • Leetcode 160. Intersection of Two Linked Lists
    Leetcode160.IntersectionofTwoLinkedLists错解一开始没看清题目的要求中,提到最后表结构不能变,想到的做法是:先遍历A,把A翻转,然后B就可以走到headA判断出它们是否相交,但是即便如此,也不能判断出相交点在哪里,而且还会破坏链表的结构,所以这种写法不行。正解classSolution{......
  • 浏览器中的 事件循环 event loop
    当浏览器碰到异步代码:异步代码会放到队列。队列有两种。微任务队列和宏任务队列。执行栈与任务队列JS在解析一段代码时,会将同步代码按顺序排在某个地方,即执行栈,然后依次执行里面的函数。当遇到异步任务时就交给其他线程处理,待当前执行栈所有同步代码执行完成后,会从一个队列中去......
  • HCI_LE_Set_Event_Mask(0x0001)命令全面解析
    目录一、命令概述二、命令格式2.1.一般格式2.2.格式示例2.3.发送命令三、命令参数详解3.1. LE_Event_Mask3.2.常见事件掩码3.3.使用注意事项四、命令返回参数说明4.1.返回事件:HCI_Command_Complete4.2.返回事件参数五、命令的执行流程5.1.命令发送(主机......
  • 屏幕“布局”运行错误之CALLBACK REJECTED BY WHITELIST
    点击屏幕中布局按钮报错 ST22图形屏幕绘制器中的运行时错误SAP的NOTE说明SM59维护TCP/IP链接,编辑回调准许列表,粘贴后保存即可TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplif......
  • CountdownEvent
    CountdownEvent是一种同步结构,主要用来协调多种同步处理后的结果场景使用。其含义为:定义一个多信号的结构,然后在应用时判断信号是否全部到达,如果全部到达则继续往下运行,否则进行阻塞,有意思的是,如果阻塞已过,那么再次运行到wait()时,线程是不会再次阻塞的,除非调用reset()重新初始化后......
  • DELPHI 隐藏程序窗口,以及TListView控件,点击标题进行排序
    设置视图: 运行效果:    unitHideWindown;interfaceusesWindows,Messages,SysUtils,Classes,Forms,StdCtrls,ActiveX,ComObj,ShellAPI,Tlhelp32,Vcl.Controls,Vcl.ComCtrls,psapi,Vcl.ExtCtrls;typeTForm1=class(TForm)GetWList......
  • ManualResetEvent&ManualResetEventSlim
    ManualResetEventManualResetEvent有三个重要的方法,分别为:waiteone(),set(),reset(),其含义如下:1.WaitOne()即等待信号发出,即可往下运行。2.set()发出信号,让线程方法继续往下运行,并允许其他线程(如有)一并往下运行。3.reset()重新初始化(即:去掉票据)变为ManualResetEvent(false)形......
  • AutoResetEvent双向信号(生产者和消费者)例子
    AutoResetEvent是一个非常有用的线程同步机制,尤其是在处理生产者和消费者问题的时候,尤其适用。本随笔记录下生产者和消费者一对一问题的两种写法并进行代码执行逻辑的分析,来加深对AutoResetEvent的理解。写法一:internalclassProgram{publicstaticAutoResetEvent_pro......