首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Leetcode No.143 重排链表

Leetcode No.143 重排链表

作者头像
week
发布2021-11-29 14:38:14
发布2021-11-29 14:38:14
21200
举报
文章被收录于专栏:用户画像用户画像
运行总次数:0

一、题目描述

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为:

L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

输入: head = [1,2,3,4] 输出: [1,4,2,3]

示例 2:

输入: head = [1,2,3,4,5] 输出: [1,5,2,4,3]

提示: 链表的长度范围为 [1, 5 * 10^4] 1 <= node.val <= 1000

二、解题思路

题目的意图是想要重组链表, 按照[头]->[尾]->[头]->[尾]...的方式重新排列 因为为单向链表, 不能从尾部逆序推出前一个节点 所以比较容易想到的是借助栈的'FILO'的特性, 逐步倒序取出尾部节点重新拼接链表 如果借助链表实现, 则需要重点考虑的问题是, 重组链表的过程中, 在何时需要停止 重组的停止条件设定: 1、当链表节点个数为奇数时,顺序遍历的当前节点和逆序遍历的节点相同时,停止。 2、当链表节点个数为偶数时,顺序遍历的下一个节点和逆序遍历的节点相同时,停止。

三、代码

代码语言:javascript
代码运行次数:0
运行
复制
import utils.ListNode;
import java.util.Stack;
public class Solution {
    public void reorderList(ListNode head) {
        ListNode curr=head;
        Stack<ListNode> stack=new Stack<ListNode>();
        while(head!=null){
            stack.push(head);
            head=head.next;
        }
        while(curr!=null){
            ListNode reorderNode=stack.pop();
            //当链表节点个数为奇数时的退出条件
            if(reorderNode==curr){
                break;
            }
            ListNode tmp=curr.next;//防止链表中断,缓存
            //当链表节点个数为偶数时的退出条件,偶数会出现循环指针的情况,即自身指向自身3->3
            if(curr==tmp){
                break;
            }
            curr.next=reorderNode;//重排,1->4
            curr=curr.next;//cur=4
            curr.next=tmp;//重排,1->4->2
            curr=curr.next;//cur=2
        }
        curr.next=null;//断除尾节点后的无效节点
    }

    public static void main(String[] args) {
        Solution solution=new Solution();
        ListNode head=new ListNode(1);
        ListNode node2=new ListNode(2);
        ListNode node3=new ListNode(3);
        ListNode node4=new ListNode(4);
        head.next=node2;
        node2.next=node3;
        node3.next=node4;
        node4.next=null;
        solution.reorderList(head);
        while(head!=null){
            System.out.print(head.val+"->");
            head=head.next;
        }
        System.out.println();
    }
}

四、复杂度分析

时间复杂度:O(N),其中 N 是链表中的节点数。

空间复杂度:O(N),其中 N 是链表中的节点数。主要为栈的内存开销。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/09/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目描述
  • 二、解题思路
  • 三、代码
  • 四、复杂度分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档