返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现LeetCode(143.链表重排序)
  • 424
分享到

C++实现LeetCode(143.链表重排序)

2024-04-02 19:04:59 424人浏览 薄情痞子
摘要

[LeetCode] 143.Reorder List 链表重排序 Given a singly linked list L: L0→L1→…→Ln-1→Ln,

[LeetCode] 143.Reorder List 链表排序

Given a singly linked list LL0→L1→…→Ln-1→Ln,
reorder it to: L0→LnL1→Ln-1→L2→Ln-2→…

You may not modify the values in the list's nodes, only nodes itself may be changed.

Example 1:

Given 1->2->3->4, reorder it to 1->4->2->3.

Example 2:

Given 1->2->3->4->5, reorder it to 1->5->2->4->3.

这道链表重排序问题可以拆分为以下三个小问题:

1. 使用快慢指针来找到链表的中点,并将链表从中点处断开,形成两个独立的链表。

2. 将第二个链翻转。

3. 将第二个链表的元素间隔地插入第一个链表中。

解法一:


class Solution {
public:
    void reorderList(ListNode *head) {
        if (!head || !head->next || !head->next->next) return;
        ListNode *fast = head, *slow = head;
        while (fast->next && fast->next->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        ListNode *mid = slow->next;
        slow->next = NULL;
        ListNode *last = mid, *pre = NULL;
        while (last) {
            ListNode *next = last->next;
            last->next = pre;
            pre = last;
            last = next;
        }
        while (head && pre) {
            ListNode *next = head->next;
            head->next = pre;
            pre = pre->next;
            head->next->next = next;
            head = next;
        }
    }
};

我们尝试着看能否写法上简洁一些,上面的第二步是将后半段链表翻转,那么我们其实可以借助栈的后进先出的特性来做,如果我们按顺序将所有的结点压入栈,那么出栈的时候就可以倒序了,实际上就相当于翻转了链表。由于只需将后半段链表翻转,那么我们就要控制出栈结点的个数,还好栈可以直接得到结点的个数,我们减1除以2,就是要出栈结点的个数了。然后我们要做的就是将每次出栈的结点隔一个插入到正确的位置,从而满足题目中要求的顺序,链表插入结点的操作就比较常见了,这里就不多解释了,最后记得断开栈顶元素后面的结点,比如对于 1->2->3->4,栈顶只需出一个结点4,然后加入原链表之后为 1->4->2->3->(4),因为在原链表中结点3之后是连着结点4的,虽然我们将结点4取出插入到结点1和2之间,但是结点3后面的指针还是连着结点4的,所以我们要断开这个连接,这样才不会出现环,由于此时结点3在栈顶,所以我们直接断开栈顶结点即可,参见代码如下:

解法二:


class Solution {
public:
    void reorderList(ListNode *head) {
        if (!head || !head->next || !head->next->next) return;
        stack<ListNode*> st;
        ListNode *cur = head;
        while (cur) {
            st.push(cur);
            cur = cur->next;
        }
        int cnt = ((int)st.size() - 1) / 2;
        cur = head;
        while (cnt-- > 0) {
            auto t = st.top(); st.pop();
            ListNode *next = cur->next;
            cur->next = t;
            t->next = next;
            cur = next;
        }
        st.top()->next = NULL;
    }
};

参考资料:

https://leetcode.com/problems/reorder-list/

Https://leetcode.com/problems/reorder-list/discuss/45175/Java-solution-with-stack

https://leetcode.com/problems/reorder-list/discuss/44992/Java-solution-with-3-steps

到此这篇关于c++实现LeetCode(143.链表重排序)的文章就介绍到这了,更多相关C++实现链表重排序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++实现LeetCode(143.链表重排序)

本文链接: https://lsjlt.com/news/130954.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++实现LeetCode(143.链表重排序)
    [LeetCode] 143.Reorder List 链表重排序 Given a singly linked list L: L0→L1→…→Ln-1→Ln, ...
    99+
    2024-04-02
  • C++实现LeetCode(148.链表排序)
    [LeetCode] 148. Sort List 链表排序 Sort a linked list in O(n log n) time using c...
    99+
    2024-04-02
  • C++实现LeetCode(147.链表插入排序)
    [LeetCode] 147. Insertion Sort List 链表插入排序 Sort a linked list using insertion sort. A graph...
    99+
    2024-04-02
  • C++怎么实现链表排序
    本篇内容主要讲解“C++怎么实现链表排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现链表排序”吧!链表排序Sort a linked list in O(n ...
    99+
    2023-06-20
  • C++实现LeetCode(83.移除有序链表中的重复项)
    [LeetCode] 83. Remove Duplicates from Sorted List 移除有序链表中的重复项 Given a sorted linked list, d...
    99+
    2024-04-02
  • C++实现LeetCode(60.序列排序)
    [LeetCode] 60. Permutation Sequence 序列排序 The set [1,2,3,...,n] contains a total o...
    99+
    2024-04-02
  • C++怎么实现链表插入排序
    本篇内容主要讲解“C++怎么实现链表插入排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现链表插入排序”吧!链表插入排序链表的插入排序实现原理很简单,就是一个元素一个元素的从原链表...
    99+
    2023-06-20
  • C++实现LeetCode(82.移除有序链表中的重复项之二)
    [LeetCode] 82. Remove Duplicates from Sorted List II 移除有序链表中的重复项之二 Given a sorted linked li...
    99+
    2024-04-02
  • C++实现LeetCode(23.合并k个有序链表)
    [LeetCode] 23. Merge k Sorted Lists 合并k个有序链表 Merge k sorted linked lists and retu...
    99+
    2024-04-02
  • C++实现LeetCode(21.混合插入有序链表)
    [LeetCode] 21. Merge Two Sorted Lists 混合插入有序链表 Merge two sorted linked lists and return it ...
    99+
    2024-04-02
  • C++实现LeetCode(206.倒置链表)
    [LeetCode] 206.Reverse Linked List 倒置链表 Reverse a singly linked list. Example: Input: 1-&g...
    99+
    2024-04-02
  • C++实现LeetCode(86.划分链表)
    [LeetCode] 86.Partition List 划分链表 Given a linked list and a value x, partition it such...
    99+
    2024-04-02
  • C++实现LeetCode(61.旋转链表)
    [LeetCode] 61. Rotate List 旋转链表 Given the head of a linked list, rotate the ...
    99+
    2024-04-02
  • 详解C++实现链表的排序算法
    目录一、链表排序二、另外一种链表排序方式三、比较两种排序的效率四、下面通过交换结点实现链表的排序一、链表排序 最简单、直接的方式(直接采用冒泡或者选择排序,而且不是交换结点,只交换数...
    99+
    2024-04-02
  • C++实现LeetCode(75.颜色排序)
    [LeetCode] 75. Sort Colors 颜色排序 Given an array with n objects colored red, white ...
    99+
    2024-04-02
  • C++归并法+快速排序实现链表排序的方法
    本文主要介绍了C++归并法+快速排序实现链表排序的方法,分享给大家,具体如下: 我们可以试用归并排序解决: 对链表归并排序的过程如下。 找到链表的中点,以中点为分界,将链表拆分成...
    99+
    2024-04-02
  • C++实现LeetCode(92.倒置链表之二)
    [LeetCode] 92. Reverse Linked List II 倒置链表之二 Reverse a linked list from position m...
    99+
    2024-04-02
  • C++实现LeetCode(141.单链表中的环)
    [LeetCode] 141. Linked List Cycle 单链表中的环 Given a linked list, determine if it has a cycle i...
    99+
    2024-04-02
  • C++实现LeetCode(203.移除链表元素)
    [LeetCode] 203.Remove Linked List Elements 移除链表元素 Remove all elements from a linked list of...
    99+
    2024-04-02
  • C语言实现单链表的快速排序算法
    目录背景设计思路算法主要步骤快速排序算法实现整个程序源代码测试案例总结背景 传统QuickSort算法最大不足之处在于,由于其基于可索引存储结构设计(一般为数组或索引表),因而无法用...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作