首页 > 其他分享 >【重排链表】双指针+反转链表+合并链表

【重排链表】双指针+反转链表+合并链表

时间:2023-12-19 12:55:25浏览次数:29  
标签:head ListNode val next 链表 sec 重排 指针

leetcode 143. 重排链表

题意:
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln

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

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

题解:
可以发现重新排列的链表,是原链表前半段和反转后的后半段交替

  1. 使用快慢指针找到链表的中间节点,将链表从中间节点断开,保证链表前半段长度不小于后半段
  2. 将后半段的链表反转
  3. 重新合并两个链表
点击查看代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public void reorderList(ListNode head) {
        ListNode dummy = new ListNode(0, head);
        ListNode slow = dummy, fast = dummy;
        while(fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode fir = head, sec = slow.next;
        sec = reverse(sec);
        while(sec != null) {
            ListNode nextSec = sec.next;
            sec.next = fir.next;
            fir.next = sec;
            fir = sec.next;
            sec = nextSec;
        }
        fir.next = null;
    }

    public ListNode reverse(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode res = reverse(head.next);
        head.next.next = head;
        head.next = null;
        return res;
    }
}

标签:head,ListNode,val,next,链表,sec,重排,指针
From: https://www.cnblogs.com/Eve7Xu/p/17913480.html

相关文章

  • 【环形链表】哈希表HashSet / 双指针
    leetcode142.环形链表II题意:不可更改链表节点,给定链表表头,返回链表在环中的第一个节点,没有返回null题解:哈希表集合遍历一遍链表,哈希表集合维护链表节点,当访问到的当前节点已经在集合中,说明当前节点是所求节点哈希表集合解代码/***Definitionforsingly-linkedlist.......
  • 代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、
    LeetCode24.两两交换链表中的节点题目链接: 24.两两交换链表中的节点提示:链表问题,首先用虚拟头节点,让链表节点的处理具有一致性!!! LeetCode19.删除链表的倒数第N个节点题目链接:19.删除链表的倒数第N个节点注意点:快慢指针,链表删除元素得找到该元素的前一个元素!!! LeetCode......
  • 详解rust 自动化测试、迭代器与闭包、智能指针、无畏并发
    编写测试可以让我们的代码在后续迭代过程中不出现功能性缺陷问题;理解迭代器、闭包的函数式编程特性;Box<T>智能指针在堆上存储数据,Rc<T>智能指针开启多所有权模式等;理解并发,如何安全的使用线程,共享数据。自动化测试编写测试以方便我们在后续的迭代过程中,不会改坏代码。保证了程序的......
  • 代码随想录算法训练营第四天| LeetCode24. 两两交换链表中的节点、19.删除链表的倒数
     LeetCode24.两两交换链表中的节点●今日学习的文章链接和视频链接代码随想录(programmercarl.com)题目链接24.两两交换链表中的节点-力扣(LeetCode)●自己看到题目的第一想法主要是把这个过程想清楚,链表交换的题目主要想明白要动几个指针,指针改变的顺序也要注意,如果......
  • 万字长文全面详解现代C++智能指针:原理、应用和陷阱
    现代C++智能指针详解:原理、应用和陷阱智能指针是C++11引入的新特性。本篇文章详细介绍了C++智能指针的原理、应用与陷阱,通过丰富的代码实例介绍了三种智能指针:std::unique_ptr、std::shared_ptr和std::weak_ptr的原理、使用方法和适用场景,还介绍了智能指针的线程安全性、使用陷阱......
  • 【反转子链表】模拟题
    leetcode92.反转链表II题意:反转链表的[left,right],返回链表表头题解:直接模拟删除的过程即可定义重要节点记录left位置的节点为lnode,right位置的节点为rnodelnode的前驱节点为pre,right位置的后继节点为suc初始化pre=suc=lnode=rnode=原链表表头前的虚拟节点......
  • 链表
    1.链表概念使用数组存储数据的缺陷:插入和删除需要移动数据复杂度为O(N)不好那么,是否有一种存储结构可以在插入删除数据时不需要移动数据?答案是链表什么是链表?链表是一种在逻辑上连续存储但是在物理上(内存空间)中不一定连续的存储结构,如下图链表中的每一个元......
  • 链表递归题型
    递归的定义在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。递归算法的设计递归的求解过程均有这样的特征:先将整个问题划分为若干个子问题,通过分别求解子问题,最后获......
  • 链表面试题解析
    链表面试题解析1.删除链表中=val的所有节点/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){......
  • [LeetCode138-链表-中等] 复制带有随机指针的链表
    这道题是这样的,就是说有一个链表LindedNode,通常我们链表包含2个属性,一个是它的值val,另一个是它指向的下一个结点nextNode,但是这个题目中的链表还有一个属性,就是它还有个随机指针,这个随机指针可能指向链表中的任意结点(包括链表的结尾null结点,或者是自己)也就是说这个链表Lin......