leetcode143重排链表

LeetCode143重排链表解析

思路:

先把链表一分为二 快慢指针 快指针一下移两步 慢指针一下移一步 快指针到终点时慢指针刚好到一半

        ListNode* fast=head;
        ListNode* slow=head;

        while(fast&&fast->next)
        {
            fast=fast->next->next;
            slow=slow->next;
        }
        ListNode* mid=slow->next;
        //本题特殊 因为重排后刚好中间两个数的相对位置不变
        slow->next=nullptr;
        ListNode* prev=nullptr;

再把第二个链表逆序 定义一个前驱 把每个节点都头插在这个前驱后面

        while(mid)
        {
            ListNode* next=mid->next;

            mid->next=prev;

            prev=mid;
            mid=next;
        }

再合并两个链表 把第二个链表插到第一个里面去

  ListNode* dummy=head;

        while(prev)
        {
            ListNode* fir=dummy->next;
            ListNode* sec=prev->next;

            dummy->next=prev;
            prev->next=fir;

            dummy=fir;
            prev=sec;

### LeetCode 重排链表 解题思路和方法 #### 方法1——线性表辅助 ##### 思路分析 为了简化操作,可以先遍历整个链表并将所有节点存储在一个列表中。之后按照新顺序重新连接这些节点即可。这种方法虽然额外使用了O(n)的空间来保存节点指针,但是逻辑简单易懂。 对于给定的单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→… 此过程可以通过创建一个数组来暂存所有的节点,再通过双指针的方式从前向后以及从后向前交替取出节点并构建新的链接关系[^1]。 ```python def reorderList(self, head: ListNode) -> None: if not head or not head.next: return nodes = [] current = head while current: nodes.append(current) current = current.next left, right = 0, len(nodes) - 1 last = head while left < right: nodes[right].next = nodes[left].next nodes[left].next = nodes[right] last = nodes[left] left += 1 right -= 1 last.next = None ``` #### 方法2——中间节点+反转链表+合并链表 ##### 思路分析 该方案旨在优化空间复杂度至 O(1),即不借助额外的数据结构完成任务。具体步骤如下: 1. 找到原链表的中间位置; 2. 对从中点开始直到结尾的部分执行逆序处理; 3. 将前半部分与经过翻转后的后半部分依次交错相连形成最终的结果链表[^2]。 找到链表中心的方法是利用快慢两个指针同时出发,当快速指针到达终点时,慢速指针正好位于中部;而针对长度为奇数的情况,则让较短的一侧多保留一个元素作为起始点[^4]。 ```python def reorderList(self, head: ListNode) -> None: if not head or not head.next: return # 寻找链表中点 slow, fast = head, head while fast and fast.next: slow = slow.next fast = fast.next.next # 反转后半部分链表 prev, curr = None, slow.next while curr: next_temp = curr.next curr.next = prev prev = curr curr = next_temp slow.next = None # 合并两部分链表 first_half, second_half = head, prev while second_half: temp1, temp2 = first_half.next, second_half.next first_half.next = second_half second_half.next = temp1 first_half, second_half = temp1, temp2 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值