99. 重排链表

99. 重排链表

难度系数 中等 通过率 24%

给定一个单链表L: L0→L1→…→Ln-1→Ln,

重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…

必须在不改变节点值的情况下进行原地操作。

您在真实的面试中是否遇到过这个题?

Yes

样例

给出链表 1->2->3->4->null,重新排列后为1->4->2->3->null

/**
 * Definition of ListNode
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *         this->val = val;
 *         this->next = NULL;
 *     }
 * }
 */

class Solution {
public:
    /*
     * @param head: The head of linked list.
     * @return: nothing
     */
    void reorderList(ListNode * head) {
        // write your code here
        	if (head == nullptr || head->next == nullptr)
        	{
        		return;
        	}

        	ListNode *slow = head, *fast = head->next;

        	while(fast&&fast->next)
        	{
        		slow = slow->next;
        		fast = fast->next->next;
        	}

        	fast = slow->next;
        	slow->next = nullptr;
        	ListNode *rHead = nullptr;
        	while (fast)
        	{
        		ListNode *r = fast->next;
        		fast->next = rHead;
        		rHead = fast;
        		fast = r;
        	}

        	fast = rHead;
        	slow = head;
        	while(slow&&fast)
        	{
        		ListNode *rr = fast->next;
        		ListNode *lr = slow->next;
        		fast->next = lr;
        		slow->next = fast;

        		fast = rr;
        		slow = lr;
        	}
    }
};

  

时间: 2024-07-30 06:20:05

99. 重排链表的相关文章

lintcode 99重排链表

描述 给定一个单链表L: L0→L1→-→Ln-1→Ln, 重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→- 必须在不改变节点值的情况下进行原地操作. 样例 思路 先将链表整体一分为二,然后将后半段链表逆序,再依次插入前半段节点中. /** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val;

GPLT天梯赛 L2-022. 重排链表

L2-022. 重排链表 时间限制 500 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一个单链表 L1→L2→...→Ln-1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln-1→L2→....例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3. 输入格式: 每个输入包含1个测试用例.每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (<= 105).结点的地址是5位非负整数,NULL地址用-

Leetcode 143.重排链表

重排链表 给定一个单链表 L:L0→L1→-→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例 1: 给定链表 1->2->3->4, 重新排列为 1->4->2->3. 示例 2: 给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3. 1 public class Solution{ 2

[leetcode]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 may not modify the values in the list's nodes, only nodes itself may be changed. Example 1: Given 1->2->3->4, reorder it to 1->4->2->3. Example 2: G

L2-2 重排链表 (25 分)

给定一个单链表 L?1??→L?2??→?→L?n−1??→L?n??,请编写程序将链表重新排列为 L?n??→L?1??→L?n−1??→L?2??→?.例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3. 输入格式: 每个输入包含1个测试用例.每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (≤).结点的地址是5位非负整数,NULL地址用−表示. 接下来有N行,每行格式为: Address Data Next 其中Address是结点地址:Data是该结

L2-2 重排链表 (25 分)

给定一个单链表 L?1??→L?2??→?→L?n−1??→L?n??,请编写程序将链表重新排列为 L?n??→L?1??→L?n−1??→L?2??→?.例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3. 输入格式: 每个输入包含1个测试用例.每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (≤).结点的地址是5位非负整数,NULL地址用−表示. 接下来有N行,每行格式为: Address Data Next 其中Address是结点地址:Data是该结

天梯 - 重排链表(模拟链表操作)

给定一个单链表 L?1??→L?2??→?→L?n−1??→L?n??,请编写程序将链表重新排列为 L?n??→L?1??→L?n−1??→L?2??→?.例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3. 输入格式: 每个输入包含1个测试用例.每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (≤105).结点的地址是5位非负整数,NULL地址用−表示. 接下来有N行,每行格式为: Address Data Next 其中Address是结点地址:Data

重排链表

题目描述:给定一个单链表L: L0→L1→-→Ln-1→Ln, 重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→-必须在不改变节点值的情况下进行原地操作 样例:给出链表1->2->3->4->null,重新排列后为1->4->2->3->null. 将L0,L1; L1,Ln-1;...排在一起,其实和回文链表(详见:点击打开链接)的逻辑是一样的,不同的是,回文链表是比较值,这里是通过"摘链"和"链接"的方法

lintcode_99.重排链表

给定一个单链表L: L0→L1→-→Ln-1→Ln, 重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→- 必须在不改变节点值的情况下进行原地操作. 样例 给出链表 1->2->3->4->null,重新排列后为1->4->2->3->null. 思路: 将链表一分为二,后半段逆序插入前半段. 参考九章:使用快慢指针(在判断链表是否含环路时使用过) class Solution: """ @param head: The