• Reorder List


    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.

    思路:

      使用HashMap记录位置,数学简易推导,进行List的变换

    我的代码:

    public class Solution {
        public void reorderList(ListNode head) {
            if(head == null)    return;
            int count = 0;
            HashMap<Integer,ListNode> hm = new HashMap<Integer,ListNode>();
            while(head != null)
            {
                hm.put(count++,head);
                head = head.next;
            }
            int sum = count - 1;
            for(int i = 0; i < count/2; i++)
            {
                ListNode cur = hm.get(i);
                ListNode next = hm.get(i + 1);
                ListNode last = hm.get(sum - i);
                cur.next = last;
                last.next = next;
                next.next = null;
            }
            return;
        }
    }
    View Code

    他人代码:

    public class Solution {
    
        private ListNode start;
    
        public void reorderList(ListNode head) {
    
            // 1. find the middle point
            if(head == null || head.next == null || head.next.next == null)return;
    
            ListNode a1 = head, a2 = head;
    
            while(a2.next!=null){
                // a1 step = 1
                a1 = a1.next;
                // a2 step = 2
                a2 = a2.next;
                if(a2.next==null)break;
                else a2 = a2.next;
            }
            // a1 now points to middle, a2 points to last elem
    
            // 2. reverse the second half of the list
            this.reverseList(a1);
    
            // 3. merge two lists
            ListNode p = head, t1 = head, t2 = head;
            while(a2!=a1){ // start from both side of the list. when a1, a2 meet, the merge finishes.
                t1 = p;
                t2 = a2;
                p = p.next;
                a2 = a2.next;
    
                t2.next = t1.next;
                t1.next = t2;
            }
        }
    
        // use recursion to reverse the right part of the list
        private ListNode reverseList(ListNode n){
    
            if(n.next == null){
                // mark the last node
                // this.start = n;
                return n;
            }
    
            reverseList(n.next).next = n;
            n.next = null;
            return n;
        }
    }
    View Code

    学习之处:

    • 他人的代码的思路更好,因为节省了空间,最后还是转换成了追击问题,通过追击问题,确定中间点进行分割,前面List和反转后的后面List进行Merge
  • 相关阅读:
    Python列表介绍和基本操作以及常用方法案例
    Python 字符串以及常用方法案例
    Python 循环语句以及常用方法案例
    Python判断语句以及常用方法案例
    python基础
    Python的简单了解
    node 安装及配件环境变量教程
    vue ui组件库
    Chrome video视频不自动播放解决方案
    在webstorm中配置本地服务器-局域网内其他设备访问(移动端手机访问测试等)
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4330191.html
Copyright © 2020-2023  润新知