Day82 | 灵神 | 快慢指针 重排链表

Day82 | 灵神 | 快慢指针 重排链表

143.重排链表

143. 重排链表 - 力扣(LeetCode)

思路:

笔者直接给跪了,这个难度真是mid吗

直接去看灵神的视频

环形链表II【基础算法精讲 07】_哔哩哔哩_bilibili

1.简单来说就是,找到链表的中间节点,然后翻转后半部分链表,然后一次修改指针就好

2.其实自己做的时候想的时候暴力去做,就是每次都找一下最后一个节点的前一个结点,然后修改指针,就是复杂度比较高

3.取逛了逛评论区,佬们还有一个思路我也觉得不错,就直接双端队列将元素全部加进去,然后前面后面分别来一个,构成新的链表,这样简单无脑,笔者觉得这个思路也很好

灵神思路中可能的疑惑?

1.为啥要找中间节点?

我觉得是因为中间结点刚好是不需要放到前面去的最后一个节点,它之后的节点都得放到前面去,不管n是奇数还是偶数

2.为啥要反转链表?

这样可以更好的找到最后一个节点,即要放到前面的节点,不需要和暴力做法一样每次都去遍历一次

完整代码:

cpp 复制代码
class Solution {
public:
    //876.链表的中间节点
    ListNode* middleNode(ListNode* head) {
        ListNode *l=head;
        ListNode *r=head;
        while(r!=nullptr&&r->next!=nullptr)
        {
            l=l->next;
            r=r->next->next;
        }
        return l;
    }
    //206.反转链表
    ListNode* reverseList(ListNode* head) {
        ListNode *p=head;
        ListNode *pre=nullptr;
        while(p!=nullptr)
        {
            ListNode* q=p->next;
            p->next=pre;
            pre=p;
            p=q;
        }
        return pre;
    }
    void reorderList(ListNode* head) {
        ListNode *mid=middleNode(head);
        ListNode *head2=reverseList(mid);
        while(head2->next)
        {
            ListNode* ntx1=head->next;
            ListNode *ntx2=head2->next;
            head->next=head2;
            head2->next=ntx1;
            head=ntx1;
            head2=ntx2;
        }
    }   
};
相关推荐
Anastasiozzzz32 分钟前
深入研究Redis的ZSet底层数据结构:从 Ziplist 的级联更新到 Listpack 的完美救场
数据结构·数据库·redis
程序员酥皮蛋1 小时前
hot 100 第四十题 40.二叉树的层序遍历
数据结构·算法·leetcode
※DX3906※1 小时前
Java排序算法--全面详解面试中涉及的排序
java·开发语言·数据结构·面试·排序算法
Chan163 小时前
LeetCode 热题 100 | 矩阵
java·开发语言·数据结构·算法·spring·java-ee·intellij-idea
im_AMBER3 小时前
Leetcode 136 最小栈 | 逆波兰表达式求值
数据结构·学习·算法·leetcode·
识君啊3 小时前
Java字符串算法核心攻略
java·数据结构·算法·leetcode·字符串·
郝学胜-神的一滴4 小时前
力扣86题分隔链表:双链表拆解合并法详解
开发语言·数据结构·算法·leetcode·链表·职场和发展
gihigo19984 小时前
SSA奇异谱分解:时频域信号成分分析与重构
数据结构·算法·重构
程序员阿鹏4 小时前
73.矩阵置零
数据结构·算法·矩阵
一叶落4384 小时前
LeetCode 191. 位1的个数(Hamming Weight)——三种解法详解(C语言)
c语言·数据结构·算法·leetcode