LeetCode Reorder List

本文介绍了一种链表重组算法,该算法将给定的单链表按特定模式重新排列,而不改变节点值。通过中间断开形成两个链表,反转后半部分链表并将其与前半部分交错合并。
部署运行你感兴趣的模型镜像

题目:

Given a singly linked list LL0L1→…→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}.

/**
 * 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)
    		return;
    	ListNode *slow = head, *fast = head, *pre = head;
    	////将列表从中间断开,形成两个链表head和slow 
		while(fast != NULL && fast->next != NULL) {
			fast = fast->next->next;
			pre = slow;
			slow = slow->next;	
		}
		pre->next = NULL;
		slow = reverseList(slow);
		mergeList(head, slow);		
    }
private:
	//将后部分链表反序 
	ListNode *reverseList(ListNode *head) {
		ListNode *cur = head;
		ListNode *pre = NULL;
		ListNode *post = cur->next;
		while(cur != NULL) {
			//记下下一个指针 
			post = cur->next;
			cur->next = pre;
			pre = cur;
			cur = post;
		}
		return pre;			
	}
	void mergeList(ListNode *head, ListNode *slow) {
		ListNode *tmp = head;
		ListNode *pre_tmp = head;
		ListNode *post_slow = slow->next;
		while(tmp != NULL) {
			post_slow = slow->next;
			slow->next = tmp->next; 
			tmp->next = slow;
			pre_tmp = tmp->next;
			tmp = tmp->next->next;
			slow = post_slow;
		} 
		if(slow != NULL)
			pre_tmp->next = slow; 
	}
};



您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值