[LeetCode 143] Reorder List Solution

19 篇文章 0 订阅

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}.

Ideas: 1. First of all, check the list is null or has only one or two element(s).

2. find the middle node of list, get the second half part of the last list

3. reverse the second half part of last list.

4. insert the second half part of list into the first half part of list


Passed:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    void reorderList(ListNode *head) {
                if(head == NULL || head->next == NULL || head->next->next ==NULL)
			return;
		
		ListNode 
			*p = head,
			*q = head;
		//get the middle node
		while(p->next!= NULL && p->next->next!= NULL)
		{
			q = q->next;
			p = p->next->next;
		}
		
		//q is the last element of the first half part list		
		//reverse the second half part list
		p = reverseList(q->next);
		q->next = NULL;
		
		//Reorder the list
		q = head;
		ListNode *first = NULL;
		ListNode *second = NULL;
		while(p)
		{
			first = q->next;
			q->next = p;
			
			second = p->next;
			p->next = first;
			
			p = second;
			q = first;
		}
		return;
    }
	
private:
	ListNode * reverseList(ListNode *half)
	{
		if(half == NULL || half->next == NULL) 
			return half;
			
		ListNode *temp = NULL;
		ListNode *tempHead = NULL;
		
		while(half)
		{
			temp = half;
			half = half->next;
			temp->next = tempHead;
			tempHead = temp;
		}
		
		return tempHead;
	}
    
};

 


NOTPassed

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    void reorderList(ListNode *head) {
        //check the initial condition
        if(head == nullptr || head->next == nullptr || head->next->next == nullptr) {
            return;
        }
        
        //Get the second half position of the list
        //using slow and fast pointer
        ListNode 
            *slow = head,
            *fast = head;
        while(fast != nullptr)
        {
            fast = fast->next;
            if(fast->next != nullptr)
            {
                fast = fast->next;
            }
            else
            {
                break;
            }
            slow = slow->next;
        }
        
        ListNode 
            *halfHead = slow->next;
        slow->next = nullptr;
        
        //reserve the second half of list
        slow = halfHead;
        ListNode *cur = halfHead;
        halfHead = nullptr;
        
        while(slow != nullptr)
        {
            cur = slow;
            slow = slow->next;
            cur->next = halfHead;
            halfHead = cur;
        }
        
        //merge two list head and half head
        fast = head;
        ListNode *curFast = head;
        slow = halfHead;
        ListNode *curSlow = halfHead;
        
        while(fast != nullptr && slow != nullptr)
        {
            curFast = fast->next;
            fast->next = slow;
            
            curSlow = slow->next;
            slow->next =  curFast;
            
            fast = curFast;
            slow = curSlow;
        }
        
        return;    
    }
};



Notes: In- place algorithm is an algorithm which transforms input using a data structure with a small, constant amount of extra storage space.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值