阅读 54

leetcode 重排链表 中等

 

 

①:用 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;
    }
};

 

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

文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐