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

    143. Reorder List

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

    You must do this in-place without altering the nodes' values.

    For example,
    Given {1,2,3,4}, reorder it to {1,4,2,3}.

    思路:首先用双指针找到中间节点,截断为left和right。然后将中间断开,将right反转,再利用归并算法将两者合并。

    不要需要注意

    while(left != nullptr && right != nullptr){
                
                dummyNode -> next = left;
                dummyNode = dummyNode -> next;
                //left = left -> next;
                cout << dummyNode -> val << endl;
                
                dummyNode -> next = right; 
                left = left -> next;
                
                cout << left -> val << endl;
                dummyNode = dummyNode -> next; 
                right = right -> next;             
                
            }

    这里left = left -> next放置位置不同,会有不同结果,放在上面是没有问题的。

    放在下面就变为死循环,原因就是上面的图。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* reverse(ListNode*  head){
            if(head == nullptr){
                return head;
            }
            ListNode* pre = nullptr;
            ListNode* cur = head;;
            ListNode* post = cur -> next;
            while(cur != nullptr){
                post = cur -> next;
                cur -> next = pre;
                pre = cur;
                cur = post;
            }
            return pre;
        }
        
        ListNode* findMid(ListNode* head){
            if(head == nullptr || head -> next == nullptr){
                return head;
            }
            ListNode* fast = head -> next;
            ListNode* slow = head;
            while(fast != nullptr && fast -> next != nullptr){
                fast = fast -> next -> next;
                slow = slow -> next;
            }
            return slow;
        }
        
        void reorderList(ListNode* head) {
            if(head == nullptr || head -> next == nullptr){
                return;
            }
            
            ListNode* mid = findMid(head);        
            ListNode* right = mid -> next;
            mid -> next = nullptr;
            
            right = reverse(right);
            
            ListNode* dummyNode = new ListNode(0);
            dummyNode -> next = head;
            
            ListNode* pHead = dummyNode;
            ListNode* left = head;
            
            ListNode*pleft = left;
            ListNode* pright = right;
            
            while(left != nullptr && right != nullptr){
                
                dummyNode -> next = left;
                dummyNode = dummyNode -> next;
                left = left -> next;
                
                dummyNode -> next = right; 
                dummyNode = dummyNode -> next; 
                right = right -> next;             
                
            }
            if(left != nullptr){
                dummyNode -> next = left;
                
            }
            if(right != nullptr){
                dummyNode -> next = right;
            }
            head = pHead -> next;
        }
    };
  • 相关阅读:
    二叉树的遍历(递归,迭代,Morris遍历)
    1003. Emergency
    1002. A+B for Polynomials
    设计模式6——创建型模式之原型模式
    设计模式5——创建型模式之建造者模式
    设计模式4——创建型模式之单例模式
    设计模式3——创建型模式之抽象工厂模式
    设计模式2——创建型模式之工厂方法模式
    设计模式1——创建型模式之简单工厂模式
    设计模式六大原则
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/7601483.html
Copyright © 2011-2022 走看看