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);
        }
  • 相关阅读:
    怎样处理人际关系中的矛盾
    如何处理人际关系
    Python包含以下函数:
    与他人有效沟通的小技巧
    沟通时容易出现的问题
    如何在工作中提升自己
    第十三周进度报告
    第十二周学习进度
    团队绩效管理
    软件对标分析
  • 原文地址:https://www.cnblogs.com/hellowooorld/p/6444509.html
Copyright © 2011-2022 走看看