zoukankan      html  css  js  c++  java
  • leetcode143- Reorder List问题

    题目要求:

        Given a singly linked list LL0→L1→…→Ln-1→Ln,
        reorder it to: L0→LnL1→Ln-1→L2→Ln-2→…

        You must do this in-place without altering the nodes' values.

    思路:

      初看到这个题目,只是提出了空间复杂度的要求,并没有提出时间复杂度要求,因此我开始的思路比较简单。

      首先固定一个位置指针,指示每次要插入的位置;

      查找链表的最后一个结点;

      将链表的最后一个结点插入到指示位置;

      位置指针下移一步。

      结束条件是:进行了链表长度的1/2次

    该种思路运行结果正确,但是超时了。。。。

    好坑啊,你也没要提示我时间复杂度啊

    思路2:

      考虑到时间复杂度的问题,又采取了另外一种思路。

      首先使用快慢指针,找到链表的中心;

      将链表的后半部分进行逆序;

      逆序完成后,将后半部分依次插入到指定位置。

      该种方法时间复杂度为O(n),空间复杂度为O(1)

    代码:

      

    public static void reorderList(ListNode head){
    if(head == null || head.next == null || head.next.next == null){
    return;
    }else{
    ListNode ptr = head, curptr = null, fast = null, slow = null;
    int len = 0; //记录链表长度
    while(ptr != null){
    len++;
    ptr = ptr.next;
    }

    //slow指针走到链表中心
    slow = head;
    fast = head;
    while(fast != null && fast.next != null){
    slow = slow.next;
    fast = fast.next.next;
    }

    //查找链表中心的前一个元素
    ListNode ptr1 = head, ptr2 = slow;
    while(ptr1.next != slow){
    ptr1 = ptr1.next;
    }
    //后半部分链表逆序
    if(len%2 == 0){
    //偶数个元素
    fast = slow.next;
    for(int i = 0; i < len/2-1; i++){
    ptr = fast.next;
    fast.next = slow;
    slow = fast;
    fast = ptr;
    }
    ptr1.next = null;
    ptr2.next = null;

    //偶数个元素的链表逆序完成后依次插入
    curptr = head;
    ListNode ptr3 = null;
    for(int i=0; i<len/2; i++){
    ptr = curptr.next;
    curptr.next = slow;
    ptr3 = slow.next;
    slow.next = ptr;
    curptr = ptr;
    slow = ptr3;
    }
    }else{
    //奇数个元素
    slow = slow.next;
    ptr1 = slow;
    fast = slow.next;
    for(int i= 0; i < len/2-1;i++){
    ptr = fast.next;
    fast.next = slow;
    slow = fast;
    fast = ptr;
    }
    ptr2.next = null;
    ptr1.next = null;

    //奇数个元素逆序后依次插入元素
    curptr = head;
    ListNode ptr3 = null;
    for(int i = 0; i < len/2; i++){
    ptr = curptr.next;
    curptr.next = slow;
    ptr3 = slow.next;
    slow.next = ptr;
    curptr = ptr;
    slow = ptr3;
    }
    }

    }
    }

  • 相关阅读:
    ASP.NET Cookies简单应用 记住用户名和密码
    index.dat文件剖析
    簇集索引与聚集索引
    C#开发飞信机器人
    详解Javascript中的Url编码/解码
    基于关系型数据库的WEB OA公文流转系统
    今天Apple陆家嘴点“开战”
    准备在cnblogs活动上的演讲
    4年技术经验
    chinajoy之行
  • 原文地址:https://www.cnblogs.com/bywallance/p/5537110.html
Copyright © 2011-2022 走看看