重排链表 几个关键点:
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,请 ...
随机推荐
-
python中获取今天昨天和明天的日期
import datetime today = datetime.date.today()oneday = datetime.timedelta(days=1)yesterday = today-on ...
-
python 应用xml.dom.minidom读xml
xml文件 <?xml version="1.0" encoding="utf-8"?> <city> <name>上海&l ...
-
第一个过滤器Filter
过滤器实现Filter接口javax.servlet.Filter package com.henau.example; import java.io.IOException; import java ...
-
TAG的用法和用途[转]
用一个例子来说明:一个combobox控件...一个textBox控件...一个datagridview控件!datagridview控件是连接数据库的...combobox和textBox是联合查询 ...
-
程序从高版本降到2.0,数据集报错 TypedTableBase
错误 命名空间“System.Data”中不存在类型或命名空间名称“TypedTableBase”(是缺少程序集引用吗?) 解决: 该错误出现在自动生成的XXX.Designer.cs里. .NET ...
-
mysql 添加[取消]timestamp的自动更新
创建自动更新的 timestamp (插入或修改时 uptime都会自动更新) CREATE TABLE `hello` (`id` int(11) NOT NULL,`uptime` timesta ...
-
IdentityServer Topics(4)- 登录
为了使IdentityServer代表用户发布令牌,该用户必须登录到IdentityServer. Cookie认证 使用来自ASP.NET Core的cookie身份验证处理程序管理的cookie跟 ...
-
Windows CE Notification API的使用方法
1 引言 以Windows CE 为操作系统的掌上电脑(如PocketPC或HPC),除具备PC的功能外,还具备很强的自身控制能力.Windows CE API超越微软其他操作系统的 API ...
-
springboot整合springdata-jpa
1.简介 SpringData : Spring 的一个子项目.用于简化数据库访问,支持NoSQL 和 关系数据存储.其主要目标是使数据库的访问变得方便快捷. SpringData 项目所支持 No ...
-
UI自动化之元素定位(xpath、css)
很早之前就已经写过自动化了,不过点着功能久了就会容易忘记元素定位,尤其是xpath和css定位,所以就花点时间做下总结收集. xpath有两种定位: 一.绝对路径(不推荐使用,除非已经使用了所有方式仍 ...