Reorder List leetcod

Given a singly linked list L: L0→L1→…→Ln-1→Ln,

reorder it to: L0→Ln→L1→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}.

题目的意思是要求对一个链表进行重新排序,如上面所示将 L0→L1→…→Ln-1→Ln,
重新排序之后变成 L0→Ln→L1→Ln-1→L2→Ln-2→…

思路: 可以看成是两个链表进行合并,现拆分 L0→Ln→L1→Ln-1→L2→Ln-2→…
 变成:

L0    L1    L2   .......

Ln    Ln-1  Ln-2  .....

所以我们可以将  L0→L1→…→Ln-1→Ln,
 折半拆分,变成   L0   L1   L2     .....Ln/2    和    Ln/2  Ln/2+1  ....Ln

然后将后半部分进行逆置
 ,变成L0    L1    L2   .......,Ln    Ln-1
 Ln-2  .....   再将两链表合并

拆分过程在链表归并排序中曾遇到过 Sort
List
   ,定义一快一慢指针,快的一次走两步,慢的一次走一步,遍历链表,最后慢的 的下一个节点为后半部分。

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode * reorderList(ListNode *head) {

        if(head==NULL||head->next==NULL||head->next->next==NULL)
                return head;
        ListNode *fast,*showl;//定义fast和showl用来找到链表的中点
        fast=head;
        showl=head;

        while(fast->next!=NULL&&fast->next->next!=NULL)
        {
            fast=fast->next->next;//fast一次走两步
            showl=showl->next;//showl 一次走一步
        }

       // ListNode *halfafter=new ListNode()
        ListNode *start,*pur,*q;

        start=showl->next;//start表示 下一半节点的开始

        //将以start开始的后半节点逆置
        pur=start;

        while(start!=NULL)
        {
            q=start;
            start=start->next;
            q->next=showl->next;
            showl->next=q;
        }
        pur->next=NULL;

        ListNode *p,*qur;
        p=head;            //前半部分第一个节点
        q=showl->next; //后半部分第一个节点
        showl->next=NULL;//断开链表
        while(q!=NULL)
        {
            pur=p->next; //用来保存前半部分的下一个节点
            qur=q->next; //用来保存后半部分的下一个节点

            p->next=q;
            q->next=pur;

            p=pur;
            q=qur;
        }

        return head;

    }
};
时间: 2024-10-11 17:03:05

Reorder List leetcod的相关文章

[LeetCode]Reorder List

Given a singly linked list L: L0→L1→-→Ln-1→Ln, reorder it to: L0→Ln→L1→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}. 这道题是将一个给定的单链表按照某种规则进行重排序,要求是不可以简单地直接交换结点中的值. 思路

143. Reorder List

本周对链表操作进行了巩固 题目: Given a singly linked list L: L0→L1→-→Ln-1→Ln,reorder it to: L0→Ln→L1→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}. 题解: 这道题虽然看上去很复杂,但经过分析,可知实质上这道题就是

Reorder List

Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→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.将链表分

leetcode143 Reorder List

Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→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 * Definition for singly-linked list. 3 *

[Linked List]Reorder List

otal Accepted: 54991 Total Submissions: 252600 Difficulty: Medium Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do this in-place without altering the nodes' values. For example,Given {1,2,3,4}, reorder

Reorder the Books HDU 5500

Reorder the Books Accepts: 127 Submissions: 237 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) 问题描述 dxy家收藏了一套书,这套书叫<SDOI故事集>,<SDOI故事集>有n(n\leq 19)n(n≤19)本,每本书有一个编号,从11号到nn号. dxy把这些书按编号从小到大,从上往下摞成一摞.dxy对这套书极其

]Leetcode]-[Reorder List ]-三种解法

Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→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-4-5-6,最开始取两头,组成1-

leetcode 【 Reorder List 】python 实现

题目: Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→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}. 代码: oj 测试通过 248 ms 1 # Definition for singly-

[Leetcode][JAVA] Reorder List

Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→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}. 比较容易思考且实现的一个思路是, 将链表从中心拆成两半,后一半全部反向连接,然后前一半和后一半一个