zoukankan      html  css  js  c++  java
  • [LeetCode]Reorder List

    Given a singly linked list L: L0L1→…→Ln-1Ln, reorder it to: L0LnL1Ln-1L2Ln-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}.

    思考:[微软原题点击]。O(n2)方法这里就不贴了。因为每次要插入的结点都是尾结点,从头结点开始寻找时间都花费在查询上。题意说只可以改变.next,这算是一个提示吧。我们可以翻转待插入链表结点,这样每次查询尾结点时间为O(1),极大减小时间复杂度。翻转链表,合并链表,非常棒的一道题目。

    class Solution {
    public:
    	ListNode *Reverse(ListNode *head)
    	{
    		if(!head||!head->next) return head;
    		ListNode *p=head;
    		ListNode *q=p->next;
    		while(q)
    		{
    			p->next=q->next;
    			q->next=head;
    			head=q;
    			q=p->next;
    		}
    		return head;
    	}
    	ListNode *Merge(ListNode *head1,ListNode *head2)
    	{
    		ListNode *p=head1;
    		ListNode *q=head2;
    		ListNode *pN,*qN;
    		while(q)
    		{
    			pN=p->next;
    			qN=q->next;
    			p->next=q;
    			q->next=pN;
    			p=pN;
    			q=qN;
    		}
    		return head1;
    	}
        void reorderList(ListNode *head) {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
    		if(!head||!head->next||!head->next->next) return;
    		ListNode *p;
    		p=head;
    		int num=0;
    		while(p)
    		{
    			p=p->next;
    			num++;
    		}
    		if(num%2) num=num/2;
    		else num=num/2-1;
    		p=head;
    		while(num--)
    			p=p->next;
    		ListNode *head2=p->next;
    		p->next=NULL;
    		head2=Reverse(head2);
    		head=Merge(head,head2);
        }
    };
    

      

  • 相关阅读:
    一 基础--进制转化
    七牛云上传视频并截取第一帧为图片(js实现)
    FNScanner二维码接口openView自定义扫码Demo
    UIPickerView 模块示例demo
    vPlayer 模块Demo
    doT的高级用法及loadData的使用
    acmPush模块示例demo
    UIChatBox模块示例demo
    分享一款基于aui框架的图文发布界面
    基于js的APP多语言处理
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3425947.html
Copyright © 2011-2022 走看看