zoukankan      html  css  js  c++  java
  • [leetcode-143-Reorder List]

    Given a singly linked list L: L0→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}.

    思路很朴素:

    1.用快慢指针将链表分为前后两部分。
    2.将后部分链表用头插法翻转。
    3.将翻转后的链表跟前半部分合并。

    ListNode* reversal(ListNode* head)
        {//将链表用头插法 翻转
            if (head == NULL || head->next == NULL) return head;
            ListNode dump(0);        
            ListNode* next = head->next;
            while (next != NULL)
            {            
                head->next = dump.next;
                dump.next = head;
                head = next;
                next = next->next;
            }
            head->next = dump.next;
            dump.next = head;
            return dump.next;
        }
        ListNode* mergeList(ListNode* head, ListNode* head2)
        {//将list2 每一个元素插入到对应位置的list1元素的后面
            ListNode* temp = head;
            ListNode* p1 = head->next;
            ListNode* p2 = head2->next;
            while (head!=NULL && p1 != NULL && p2!= NULL)
            {
                head->next = head2;
                head2->next = p1;
                head = p1;
                p1 = p1->next;
                head2 = p2;
                p2 = p2->next;
            }
            head->next = head2;
            head2->next = p1;//处理最后一个结点
            return temp;
        }
        void reorderList(ListNode* head)
        {
            if (head == NULL || head->next == NULL || head->next->next == NULL) return;
            ListNode* slow = head, *fast = head;
            while (fast->next!=NULL && fast->next->next!=NULL)//当fast结点后只有一个或者没有结点时停止循环
            {
                slow = slow->next;
                fast = fast->next->next;
            }    
            ListNode*lastPart = reversal(slow->next); //后半部分链表 翻转        
            slow->next = NULL;//将链表分为前后两个部分    前一个链表长度大于或者等于后边链表长度
    
            head = mergeList(head, lastPart);
        }
  • 相关阅读:
    javascript 调试代码
    简洁的js拖拽代码
    搭个小窝
    FastDFS随笔
    JDK6和JDK7中String的substring()方法及其差异
    杂笔
    JVM内存随笔
    java中的final和volatile详解
    关于java的Synchronized,你可能需要知道这些(下)
    关于java的Synchronized,你可能需要知道这些(上)
  • 原文地址:https://www.cnblogs.com/hellowooorld/p/6444509.html
Copyright © 2011-2022 走看看