题解 | #重排链表#

重排链表

https://www.nowcoder.com/practice/3d281dc0b3704347846a110bf561ef6b

普通做法:用一个数组集合保存下来,然后按需遍历。

public class Solution {
    public void reorderList(ListNode head) {
        if(head==null) return;
//         初级:使用集合存储然后按需遍历
        List<ListNode> res = new ArrayList<>();
        ListNode node = head;
        while(node!=null){
            res.add(node);
            node = node.next;
        }
//         按需遍历,在原链表上修改
        int i = 0,j = res.size()-1;
        while(i<j){
            res.get(i).next = res.get(j);
            i++;
            if(i==j) break;
            res.get(j).next = res.get(i);
            j--;
        }
        res.get(i).next = null;
    }
}

进阶:不适用外部空间,找到中间节点截断;然后将后半部分翻转;最后两部分直接映射

public class Solution {
    public void reorderList(ListNode head) {
        if(head==null || head.next==null) return;
        // 找到中间节点
        ListNode mid = middle(head);
        // 后半部分节点位置
        ListNode l2 = reverse(mid.next);
        ListNode l1 = head;
        // 截取了
        mid.next = null;
        mapping(l1,l2);
    }
    // 考点:如何找到一个链表的中间节点?双指针
    public ListNode middle(ListNode head){
        ListNode slow = head,fast=head;
        while(fast.next!=null && fast.next.next!=null){
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
    // 考点:翻转链表,这里用递归的形式
    public ListNode reverse(ListNode node){
        if(node.next == null || node==null) return node;
        ListNode pre = reverse(node.next);
        node.next.next = node;
        node.next = null;
        return pre;
    }
    public void mapping(ListNode l1,ListNode l2){
        // 保留后一个节点
        ListNode l1Temp=null,l2Temp=null;
        while(l1!=null && l2!=null){
            l1Temp = l1.next;
            l2Temp = l2.next;
            l1.next = l2;
            l1 = l1Temp;
            l2.next = l1;
            l2 = l2Temp;
        }
    }
}
全部评论

相关推荐

牛客915519934号:差不多得了 ,真以为我们好忽悠呢?当初就是听了你们的话没有赶上风口入行Java,现在还想再忽悠我呢?这明显就是一个新风口,国家大力发展制造业,以后这个圈子的钱只会越来越多,不管是入门还是大佬,只要进来少说有你一口饭吃,一个个自私自利自己上了车就劝退其他人,钱都让你赚得了呗。就这点东西,入门很容易的,学个pcb,单片机就可以去找工作了,少说一万五起,以后只会越来越高,以后想进阶就去FPGA,linux,给的钱吊打互联网,再说说你们一直说数电模电难?实际呢也不过一个月就能拿下的事情,你不需要学的多深,只需要入门就足够了,就按我说的学出来少说两万起,最好报个培训班,入门更快,兄弟们跟着我冲就完事了,趁着这个机会,狠狠赚他一笔。
点赞 评论 收藏
分享
投递经纬创投等公司10个岗位 >
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务