LeetCode 重排链表 OPPO笔试
重排链表 几个关键点:
1. 双指针(快慢指针找中点)(用于反转后一部分)
2. 反转后一部分 (reverse函数)
3. 合并链表
合并的时候在笔试的时候想了一种比我之前想的简单的方法
从slow->next开始反转 而不是slow,如果从slow开始反转实际上会多插入最后一次 就会复杂一点
同时保存slow作为最后一个结点,断开slow后面的节点 进行合并
然后合并的时候注意 使用后面的链表p作为循环结束的条件,因为p为空说明所有的链表已经插入前面的链表了。
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int v):val(v),next(NULL){}
};
ListNode* reverseList(ListNode *head)
{
ListNode *cur = head, *pre = NULL, *nxt =NULL;
while(cur)
{
nxt = cur->next;
cur->next = pre;
pre = cur;
cur = nxt;
}
return pre;
}
void helper(ListNode * head)
{
//快慢指针
ListNode *slow=head,*fast=head;
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
}
ListNode *newNode = slow->next;
slow->next=NULL;
ListNode *newHead = reverseList(newNode);
ListNode *cur=head,*nxt=NULL,*p=newHead,*pnxt=NULL;
while(p)
{
pnxt = p->next;
nxt = cur->next;
cur->next = p;
p->next = nxt;
cur = nxt;
p = pnxt;
}
ListNode *res =head;
cout<<"[";
while(res->next)
{
cout<<res->val<<",";
res=res->next;
}
cout<<res->val<<"]";
}
int main()
{
string str;
getline(cin, str);
int n = str.size();
string strlist = str.substr(8,n-9);
//建立链表
if(strlist.empty())
{
cout<<"error"<<endl;
return 0;
}
if(strlist.size()==1)
{
cout<<"["<<strlist[0]<<"]";
return 0;
}
stringstream ss(strlist);
string p;
ListNode *dummy = new ListNode(-1);
ListNode *pp = dummy;
while(getline(ss,p,','))
{
int num = stoi(p);
ListNode *numNode = new ListNode(num);
//cout<<numNode->val<<endl;
pp->next = numNode;
pp = numNode;
}
ListNode *head=dummy->next;
ListNode *res =head;
//head = [1,2,3,4,5,6]
helper(head);
return 0;
}
LeetCode 重排链表 OPPO笔试的更多相关文章
- Leetcode 143.重排链表
重排链表 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示 ...
- Java实现 LeetCode 143 重排链表
143. 重排链表 给定一个单链表 L:L0→L1→-→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节 ...
- LeetCode:链表专题
链表专题 参考了力扣加加对与链表专题的讲解,刷了些 leetcode 题,在此做一些记录,不然没几天就没印象了 出处:力扣加加-链表专题 总结 leetcode 中对于链表的定义 // 定义方式1: ...
- 【Warrior刷题笔记】143.重排链表 【线性化 || 双指针+翻转链表+链表合并】详细注释
题目一 力扣143.重排链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reorder-list/ 1.描述 给定一个单链表L的头节点he ...
- Leetcode解题-链表(2.2.0)基础类
1 基类的作用 在开始练习LeetCode链表部分的习题之前,首先创建好一个Solution基类,其作用就是: Ø 规定好每个子Solution都要实现纯虚函数test做测试: Ø 提供了List ...
- LeetCode 单链表专题 (一)
目录 LeetCode 单链表专题 <c++> \([2]\) Add Two Numbers \([92]\) Reverse Linked List II \([86]\) Parti ...
- L2-022 重排链表 (25 分)
L2-022 重排链表 (25 分) 给定一个单链表 L1→L2→⋯→Ln−1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln−1→L2→⋯.例 ...
- 【算法题 14 LeetCode 147 链表的插入排序】
算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...
- L2-022. 重排链表
L2-022. 重排链表 时间限制 500 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一个单链表 L1→L2→...→Ln-1→Ln,请 ...
随机推荐
- 常用的ppt技巧
取色器 对齐 形状使用
- Composer基础
摘要 本文介绍Composer的入门知识,包括require和autoload部分. Java有Maven, Node.js有npm, ROR有gem, 这些语言的程序员在开心地使用包管理工具加速开发 ...
- P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】
正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为\(n\),剩余\(hp\)点生命,然后每个时刻如果生命值没有满那么有\( ...
- Python+requests环境搭建和GET基本用法
Python+requests环境搭建 首先你得安装Python,然后安装requests模块(第3方模块,安装方法:pip install requests) 基本用法 get 请求(不带参数的) ...
- 使用VisualStudioCode开发Vue
前言 本文主要介绍在VisualStudioCode下开发Vue. Nodejs.Npm.Vue的项目搭建参考下面文章. 用后台开发的逻辑理念学习VUE 在Windows下学习Nodejs.Npm和V ...
- Docker里面没有你期望的命令、甚至没有yum怎么办?
分享小知识点 跟大家分享一个实用的小知识点 有时候在docker容器里面不仅没有你期望的那些常用的命令,甚至没有yum命令让你去安装那些常用的命令 怎么办呢?不要慌! 没有yum命令说明这个容器的系统 ...
- Java(1)开发环境配置及第一个程序Hello World
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201468.html 博客主页:https://www.cnblogs.com/testero ...
- NX屏蔽窗口的按钮
有时候在激活一个命令按钮的时候,需要同时禁止掉另外一个或多个命令按钮 ''' <summary> ''' 取按钮是否敏感 ''' </summary> ''' <para ...
- Jmeter之BeanShell 断言
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15436864.html 博客主页:https://www.cnblogs.com/testero ...
- win 常用修复蓝屏,系统比对最后更新20210804
您可以尝试以下方案: 在管理员命令提示符下键入以下命令:Dism /Online /Cleanup-Image /ScanHealth这条命令将扫描全部系统文件并和官方系统文件对比,扫描计算机中的不一 ...