[LeetCode By Python] 143. Reorder List

一、题目

Reorder List

二、解题

把链表组成一个环状,1,2,3,4->1,4,2,3

  • 定义两个方向的指针,第一个方向从头往后,从1指向9
  • 第二个指针,定义一个方法findLast,遍历一遍找到上一个指针,从8指向1的下一个2
  • 最后注意偶数和奇数个数的操作有些许不同。

三、尝试与结果

class Solution(object):
    def findLast(self,last):
        t = last
        while last.next != t:
            last = last.next
        return last

    def reorderList(self, head):
        if head == None:
            return None
        if head.next == None:
            return head

        p = head
        while p.next != None:
            p = p.next
        last = p

        p = head
        while p.next != last and p != last:
            q = p
            p = p.next  
            q.next = last
            last.next = p
            last = self.findLast(last)
        
        if p.next == last:
            p.next = last
            last.next = None

        if p == last:
            last.next = None

        while head != None:
            head = head.next
        return head

结果:TL,是能够解出答案的,但是时间复杂度是O(n^2)

四、学习与记录

根据提示,把链表分成两部分,然后后半部分翻转插入。

class Solution(object):
    def reorderList(self, head):
        if head == None:
            return None
        if head.next == None:
            return 

        fast = head
        slow = head

        # 快慢指针找中点
        while (fast.next != None and fast.next.next != None):
            fast = fast.next.next
            slow = slow.next
        
        front = slow.next
        slow.next = None

        # 链表的反向
        last = None
        mid = None
        while front.next != None:
            mid = front
            front = front.next
            mid.next = last
            last = mid

        front.next = mid


        # 链表的合并插入(front 和head的合并插入)
        first = head
        result = first
        second = front
        while first.next != None:
            temp = first
            first = first.next
            temp.next = second
            temp = temp.next
            second = second.next
            temp.next = first

        if second != None:
            first.next = second
        
        head = result
        return 

结果:AC

找中点使用的是快慢指针
反向使用了三个指针
合并采用了归并

最后有个坑,返回值不是要结果链表的头,而是直接赋值给head就可以了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 因为之前就复习完数据结构了,所以为了保持记忆,整理了一份复习纲要,复习的时候可以看着纲要想具体内容。 树 树的基本...
    牛富贵儿阅读 7,045评论 3 10
  • 1、线性表、栈和队列等数据结构所表达和处理的数据以线性结构为组织形式。栈是一种特殊的线性表,这种线性表只能在固定的...
    雾熏阅读 2,478评论 0 10
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,495评论 3 44
  • 一、 C/C++程序基础 面试例题1——分析代码写输出(一般赋值语句的概念和方法)。 面试例题2—...
    LuckTime阅读 2,041评论 2 42
  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 1,486评论 1 3