Leetcode#143(链表)-Reorder List

5 篇文章 0 订阅
4 篇文章 0 订阅

题目:

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

思路:把链表分成左右两部分,当链表元素个数为偶数时,左右两部分元素个数相同,当链表元素个数为奇数时,左部分元素个数比又部分多1个。将右部分链表翻转。最后将左右两部分链表元素轮流合并。

通过代码:

void reorderList(ListNode* head) {
	 if (head == NULL || head->next == NULL || head->next->next == NULL)return ;
	 ListNode* pre_head = new ListNode(0);
	 ListNode* p1 = head;
	 ListNode* p2 = head;
	 while (p2 != NULL&&p2->next != NULL&&p2->next->next != NULL) { //将链表分成左右两部分
		 p1 = p1->next;
		 p2 = p2->next->next;
	 }
	 ListNode* t = p1;
	 ListNode* s = p1->next;
	 t->next = NULL; //为了让右部分链表反转后链表尾为空,便于后面判断s到达链表尾调出循环
	 ListNode* temp = NULL;
	 while (s != NULL) { //将右部分链表翻转
		 temp = t->next;
		 t->next = s;
		 s = s->next;
		 t->next->next = temp;
	 }
	 s = t->next;
	 t->next = NULL;
	 ListNode* cur = head;
	 ListNode* p3 = pre_head;
	 while (s != NULL&&cur != NULL) { //链表合并
		 cur = cur->next;
		 p3 = p3->next;
		 p3->next = s;
		 s = s->next;
		 p3 = p3->next;
	 }
	 if (s != NULL) {
		 p3->next = s;
		 p3 = p3->next;
	 }
	 if (cur != NULL) {
		 p3->next = cur;
		 p3 = p3->next;
	 }
 }



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值