zoukankan      html  css  js  c++  java
  • Leetcode Reorder List

    实现链表如下所示:

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

    一开始想到一个n方的,就是每次找最后一个回调到相应位置,然后倒数第二个的next置为NULL,依次类推。果然超时。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        void reorderList(ListNode *head)
        {
            if (!head || !head->next) return ;
            ListNode *cur, *last, *next_cur, *pre_last;
            last = head -> next;
            pre_last = head;
            while(last -> next)
            {
                pre_last = last;
                last = last -> next;
            }
            cur = head;
            next_cur = head -> next;
    
            while(cur -> next || cur -> next != last)
            {
                cur -> next = last;
                pre_last -> next = NULL;
                cur = next_cur;
                next_cur = cur -> next;
                last = cur -> next;
                pre_last = cur;
                while(last && last -> next)
                {
                    pre_last = last;
                    last = last -> next;
                }
            }
            return ;
        }
    };
    View Code

    也可以用map<int, ListNode*>来做吧应该,但用了其他空间了。下面是比较直接的没有用多余空间的解法。

    分成两半,后面一半反转,然后合并前后两半。

    需要注意的是,前面一半的最后一个记得赋值NULL,还有如果是奇数,那么前面一半应该多一个。自己随便举个1234和12345的例子画一下就知道怎么合并怎么分了。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        void reorderList(ListNode *head)
        {
            if (!head || !head -> next) return ;
            ListNode *slow = head, *quick = head -> next;
            while(quick && quick -> next) // 分成两部分
            {
                slow = slow -> next;
                quick = quick -> next;
                if (!quick)
                    break;
                quick = quick -> next;
            }
            quick = slow -> next;
            ListNode *last = quick -> next;
            while(last) // 反转后半部
            {
                quick -> next = last -> next;
                last -> next = slow -> next;
                slow -> next = last;
                last = quick -> next;
            }
            quick = slow -> next;
            slow -> next = NULL;
    
            ListNode *next_cur = head -> next, *next_quick, *cur = head;
            while(cur && quick) // 合并两部分
            {
                cur -> next = quick;
                next_quick = quick -> next;
                quick -> next = next_cur;
                quick = next_quick;
                cur = next_cur;
                if (cur)
                    next_cur = cur -> next;
            }
        }   
    };
  • 相关阅读:
    学习鸟哥的Linux私房菜笔记(16)——Ubuntu中建立ftp服务
    gdal库对ENVI文件的一点支持不好
    学习鸟哥的Linux私房菜笔记(15)——文件系统
    学习鸟哥的Linux私房菜笔记(14)——硬件配置与管理
    使用jQuery加载script脚本
    学习鸟哥的Linux私房菜笔记(13)——用户管理
    学习鸟哥的Linux私房菜笔记(12)——系统监视2
    学习鸟哥的Linux私房菜笔记(11)——系统监视1
    学习鸟哥的Linux私房菜笔记(10)——bash2
    学习鸟哥的Linux私房菜笔记(9)——bash1
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4161835.html
Copyright © 2011-2022 走看看