题解 | #重排链表#快慢指针分为前后半段,然后翻转后半段

重排链表

https://www.nowcoder.com/practice/3d281dc0b3704347846a110bf561ef6b

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
  public:
    void reorderList(ListNode* head) {
        if (!head || !head->next) return;
        ListNode* slow = head, *qulick = head->next;
        while (qulick && qulick->next) {
            slow = slow->next;
            qulick = qulick->next->next;
        }
        ListNode* left = head, *right = slow->next;
        slow->next = nullptr;
        right = reverse(right);
        ListNode* p = left, *q = right, *dummy = new ListNode(-1), *tail = dummy;
        while (p && q) {
            tail->next = p;
            tail = p;
            p = p->next;
            tail->next = q;
            tail = q;
            q = q->next;
        }
        if (p) tail->next = p;
    }

    ListNode* reverse(ListNode* head) {
        if (!head || !head->next) return head;
        ListNode* newHead = reverse(head->next);
        head->next->next = head;
        head->next = nullptr;
        return newHead;
    }
};

全部评论

相关推荐

05-20 13:59
门头沟学院 Java
米黑子米黑子:你这个成绩不争取下保研?
点赞 评论 收藏
分享
05-23 19:02
吉林大学 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 11:45
你不要过来啊啊啊啊啊啊啊
码农索隆:对面:“今天你不面也得面”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务