[leetcode]143. Reorder List

本文介绍了一种链表重组算法,该算法将链表分为两部分,然后反转后半部分链表,并将其与前半部分链表交错合并。文章提供了详细的步骤解析及C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a singly linked list LL0→L1→…→Ln-1→Ln,
reorder it to: L0→LnL1→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.合并两个链表。(递归)

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* ReverseList(ListNode* head){
12     if(head==NULL||head->next==NULL)
13         return head;
14     ListNode* p=head->next,*q=head,*l=head;
15     while(p->next!=NULL){
16         l=p->next;
17         p->next=q;
18         q=p;
19         p=l;
20     }
21     p->next=q;
22     head->next=NULL;
23     return p;
24 }
25 ListNode* Merge(ListNode* l1,ListNode* l2){
26     if(l1==NULL)
27         return l2;
28     if(l2==NULL){
29         l1->next=NULL;
30         return l1;
31     }
32     ListNode* p=l1,*q=l2;
33     l1=l1->next;
34     l2=l2->next;
35     p->next=q;
36     q->next=Merge(l1,l2);
37     return p;
38 }
39     void reorderList(ListNode* head) {
40         if(head==NULL||head->next==NULL)
41             return;
42         ListNode* p=head,*q=head,*bf=NULL;
43         while(p&&p->next!=NULL){
44             p=p->next->next;
45             bf=q;
46             q=q->next;
47     }
48     bf->next=NULL;
49     q=ReverseList(q);
50     Merge(head,q);
51     return;
52     }
53 };

 

转载于:https://www.cnblogs.com/LUO77/p/5672007.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值