zoukankan      html  css  js  c++  java
  • LeetCode 143. Reorder List

    143. Reorder List

    Given a singly linked list LL0→L1→…→Ln-1→Ln,
    reorder it to: L0→LnL1→Ln-1→L2→Ln-2→…

    You may not modify the values in the list's nodes, only nodes itself may be changed.

    Example 1:

    Given 1->2->3->4, reorder it to 1->4->2->3.

    Example 2:

    Given 1->2->3->4->5, reorder it to 1->5->2->4->3.

    //将链表分为前后两部分(使用fast和slow两个指针), 然后将后面的链表进行翻转,这样就可以按
    //顺序将两个链表合并。(1. 链表翻转 2. 链表合并 3. 拆分两个链表)题目的结合.

    翻转链表的思路:生成头插法生成一条新链表(pre)

    递归写法和非递归写法

    #include <iostream>
    
    using namespace std;
    
    
    struct ListNode
    {
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };
    
    class Solution
    {
    public:
        void reorderList(ListNode *head)
        {
            //将链表分为前后两部分(使用fast和slow两个指针), 然后将后面的链表进行翻转,这样就可以按
            //顺序将两个链表合并。(1. 链表翻转 2. 链表合并 3. 拆分两个链表)题目的结合.
            if (head == NULL || head->next == NULL || head->next == NULL) {
                return;
            }
    
            ListNode *slow = NULL, *fast = head->next;
            while (fast && fast->next)
            {
                slow = fast;
                fast = fast->next;
            }
    
            slow->next = NULL;
            ListNode *next = head->next;
            //翻转链表
            reorderList(next);
    
            //链表合并  
            head->next = fast;
            fast->next = next;
    
        }
     //非递归
        void reorderList_noRecive(ListNode *head)
        {
    
            if (head == NULL || head->next == NULL || head->next == NULL) {
                return;
            }
    
            ListNode *slow = head, *fast = head->next, *second = NULL;
            while (fast && fast->next)
            {
                fast = fast->next->next;
                slow = slow->next;
            }
            second = slow->next;
            slow->next = NULL;
            //将后面链表翻转
            ListNode *pre = NULL, *next = NULL;
            while (second != NULL)
            {
                next = second->next;  //存储第一条链表上下一个节点
                //头插法,生成一条新链表
                second->next = pre;
                pre = second;
                second = next;
            }
    
            //将两个链表合并, 把第二个链表的每个元素插在第一个链表的后面
            fast = head;
            while (pre != NULL)
            {
                next = pre;         // next保持新链表pre的当前节点
                pre = pre->next;
                next->next = fast->next;
                fast->next = next;
                fast = fast->next->next;
            }
        }
    
    };
    
    void test_data()
    {
            ListNode *head = new ListNode(0);
            ListNode *p ;
            p = head;
            Solution s;
            int n = 0;
            int T = 5;
    
            while (T-- && cin >> n)
            {
                ListNode *q;
                q = new ListNode(n);
                p->next = q;
                p = q;
    
            }
    
            head = head->next;
            s.reorderList(head);
            while (head)
            {
                cout << head->val << " ";
                head = head->next;
    
            }
    
    }
    
    void test_data1()
    {
            ListNode *head = new ListNode(0);
            ListNode *p ;
            p = head;
            Solution s;
            int n = 0;
            int T = 5;
    
            while (T-- && cin >> n)
            {
                ListNode *q;
                q = new ListNode(n);
                p->next = q;
                p = q;
             
            }
    
            head = head->next;
            s.reorderList_noRecive(head);
            while (head)
            {
                cout << head->val << " ";
                head = head->next;
             
            }
    
    }
    
    int main()
    {
    
        test_data();
    
        test_data1();
    
        return 0;
    }

  • 相关阅读:
    完全背包和多重背包的混合 F
    多重背包转化成完全背包 E
    I
    D. Beautiful Array DP
    B. Long Path dp
    C. Barcode dp
    dp D. Caesar's Legions
    docker-mysql
    日志级别facility
    实时同步lsyncd
  • 原文地址:https://www.cnblogs.com/douzujun/p/10634039.html
Copyright © 2011-2022 走看看