zoukankan      html  css  js  c++  java
  • 【LeetCode-链表】重排链表

    题目描述

    给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
    将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…

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

    示例:

    给定链表 1->2->3->4, 重新排列为 1->4->2->3.
    
    给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
    

    题目链接: https://leetcode-cn.com/problems/reorder-list/

    思路

    步骤如下:

    • 将链表在中间断开;
    • 将后一段链表翻转;
    • 合并两段链表;

    需要注意的是,假设原链表长度为奇数,例如 5,则断开后第一段链表的长度为 3,第二段链表的长度为 2;如果原链表的长度为偶数,则从中间两个节点之间断开,例如原链表长度为 4,则断开后两段链表的长度均为 2。

    代码如下:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        void reorderList(ListNode* head) {
            if(head==nullptr) return;
    
            ListNode* slow = head;
            ListNode* fast = head;
            while(fast->next!=nullptr && fast->next->next!=nullptr){ // 断开链表
                slow = slow->next;
                fast = fast->next->next;
            }
            ListNode* next = slow->next; // next 是后一段链表的链表头
            slow->next = nullptr;  // 别忘了这一步
            ListNode* head2 = reverse(next); // head 是翻转后后一段链表的链表头
    
            /*合并*/
            ListNode* cur1 = head;
            ListNode* cur2 = head2;
            while(cur1!=nullptr && cur2!=nullptr){
                ListNode* next1 = cur1->next;
                cur1->next = cur2;
                ListNode* next2 = cur2->next;
                cur2->next = next1;
                cur1 = next1;
                cur2 = next2;
            }
        }
    
        ListNode* reverse(ListNode* head){
            if(head==nullptr) return head;
    
            ListNode* pre = nullptr;
            ListNode* cur = head;
            while(cur!=nullptr){
                ListNode* next = cur->next;
                cur->next = pre;
                pre = cur;
                cur = next;
            }
            return pre;
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(1)
  • 相关阅读:
    HDU1251统计难题map+输入
    HDU1863畅通工程
    POJ2253 Frogger
    HDU 4725 (The Shortest Path in Nya Graph)层次网络
    hdu5521(Meeting)spfa 层次网络最短路
    Fire Net ZOJ 1002
    POJ3259(Wormholes) 判断负环
    POJ3268(Silver Cow Party)
    棋盘问题 POJ 1321
    POJ 1661 (Help Jimmy )
  • 原文地址:https://www.cnblogs.com/flix/p/13526688.html
Copyright © 2011-2022 走看看