3.25【LeetCode练习】重排链表

重排链表

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:
输入:head = [1,2,3,4]
输出:[1,4,2,3]

示例 2:
输入:head = [1,2,3,4,5]
输出:[1,5,2,4,3]

提示:
链表的长度范围为 [1, 5 * 104]
1 <= node.val <= 1000

我以为我找链表队尾的时候已经用了一点小trick来着,但结果还是一如既往的菜…
在这里插入图片描述
贴贴代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    void reorderList(ListNode* head) {
        int count=1;
        ListNode* nowHead=new ListNode();
        ListNode* tail=new ListNode();
        nowHead=head;
        while (nowHead->next!=nullptr){
            count++;
            nowHead=nowHead->next;
        }
        tail=nowHead;
        nowHead=head;
        int changeCount=count/2;
        int flag=count%2;
        count--;
        for (int i=0;i<changeCount;i++){
            tail->next=nowHead->next;
            nowHead->next=tail;
            ListNode* tmp=new ListNode();
            tmp=nowHead;
            for (int i=0;i<count;i++){
            	tmp=tmp->next;
			}
			count-=2;
            tail=tmp;
            nowHead=nowHead->next->next;
        }
        tail->next=nullptr;
    }
};

去看题解了…是我狭隘了…人家把链表存成线性表了,这样就不用找什么队尾节点,纯纯 O ( N ) O(N) O(N) 的复杂度了,还是要打开思路!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值