首页 > 其他 > 详细

leetcode 重排链表 中等

时间:2021-09-17 14:30:23      阅读:18      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

①:用 vector 存下整个链表,然后按题目要求链起来即可。时间空间 O(n)

②:将链表从中间位置分割为两个链表,并将后半部分链表进行反转,然后再链起来即可。时间 O(n),空间 O(1)

class Solution {
public:
    void reorderList(ListNode* head) {
        ListNode *tail = reverseHalfList(head);
        ListNode *ptr = head;
        while(tail) {      // tail 为 nullptr, 整个链接就完成了.
            ListNode *ptrNext = ptr -> next;
            ListNode *tailLast = tail -> next;
            ptr -> next = tail;
            tail -> next = ptrNext;
            ptr = ptrNext;
            tail = tailLast;
        }
    }

private:
    ListNode* reverseHalfList(ListNode *head) {
        ListNode *slow = head, *quick = head;
        // 寻找链表中间节点
        // 链表结点为单数, slow 停止中间节点. 为偶数 slow 停止在中间第一个结点
        while(quick && quick -> next && quick -> next -> next) {
            slow = slow -> next;
            quick = quick -> next -> next;
        }

        ListNode *slowNext = slow -> next;
        slow -> next = nullptr;
        return reverseList(slowNext);
    }

    ListNode* reverseList(ListNode *head) {
        ListNode *pre = nullptr;
        while(head) {
            ListNode *nxt = head -> next;
            head -> next = pre;
            pre = head;
            head = nxt;
        }
        return pre;
    }
};

 

leetcode 重排链表 中等

原文:https://www.cnblogs.com/rookie-acmer/p/15302383.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!