leetcode链表题

1. sort_list

Sort a linked list in O(n log n) time using constant space complexity.

分析:时间复杂度是nlogn,所以可以考虑归并排序。取中点,对左边和右边分别递归排序,最后合并。

知识点:快慢指针,用来取链表中点;归并排序。

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode *sortList(ListNode *head) {
12         if(!head||!head->next)return head;
13         ListNode *first = head;
14         ListNode *second = head->next;
15         while(second&&second->next){
16             first=first->next;
17             second=second->next->next;
18         }
19         ListNode *left = sortList(first->next);
20         first->next = NULL;
21         ListNode *right = sortList(head);
22         return merge(left,right);
23     }
24     ListNode *merge(ListNode *head1, ListNode *head2)
25      {
26          if(head1 == NULL)return head2;
27          if(head2 == NULL)return head1;
28          ListNode *res , *p ;
29          if(head1->val < head2->val)
30              {res = head1; head1 = head1->next;}
31          else{res = head2; head2 = head2->next;}
32          p = res;
33          
34          while(head1 != NULL && head2 != NULL)
35          {
36              if(head1->val < head2->val)
37              {
38                  p->next = head1;
39                  head1 = head1->next;
40              }
41              else
42              {
43                  p->next = head2;
44                  head2 = head2->next;
45              }
46              p = p->next;
47          }
48          if(head1 != NULL)p->next = head1;
49          else if(head2 != NULL)p->next = head2;
50          return res;
51      }
52 };

2. linked-list-cycle-ii

Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull.

Follow up:
Can you solve it without using extra space?

分析:寻找链表的入环节点,也是使用快慢指针,快慢指针第一次相遇后将快指针放回链表头,然后以相同的速度前进,再次相遇的节点就是链表的入环节点。

知识点:快慢指针找入环节点

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode *detectCycle(ListNode *head) {
12         while(!head||!head->next)return nullptr;
13         ListNode *slow = head;
14         ListNode *fast = head;
15         while(fast != NULL && fast->next != NULL){
16             slow=slow->next;
17             fast=fast->next->next;
18             if(fast==slow)break;
19         }
20         if(!fast||!fast->next)return nullptr;
21         fast=head;
22         while(slow != fast){
23             slow = slow->next;
24             fast = fast->next;
25         }
26         return slow;
27     }
28 };

 3. convert-sorted-list-to-binary-search-tree

     Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

分析:可以递归建立平衡二叉查找树,将链表中间的值设为树的根,对左边和右边分别建立二叉查找树。

知识点:递归,快慢指针

class Solution {
public:TreeNode *sortedListToBST(ListNode *head) {return ToBST(head,nullptr);}TreeNode *ToBST(ListNode *head,ListNode *tail){if(head==tail)return nullptr;ListNode *fast = head;ListNode *slow = head;while(fast!=tail&&fast->next!=tail){fast=fast->next->next;slow=slow->next;}TreeNode *tr= new TreeNode(slow->val);tr->left = ToBST(head,slow);tr->right = ToBST(slow->next,tail);return tr;}
};

 4. partition-list

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

For example,
Given1->4->3->2->5->2and x = 3,
return1->2->2->4->3->5.

 分析:将小于某值的节点按顺序移至前面,我这里为了方便直接建立了两个vector分别按序存储值小于x和大于等于x的节点。

class Solution {
public:ListNode *partition(ListNode *head, int x) {vector<int> a;vector<int> b;ListNode *li=head;while(li){if(li->val<x)a.push_back(li->val);else b.push_back(li->val);li = li->next;}li = head;for(int i=0;i<a.size();i++){li->val=a[i];li=li->next;}for(int i=0;i<b.size();i++){li->val=b[i];li=li->next;}return head;}
};

5. remove-duplicates-from-sorted-list

Given a sorted linked list, delete all duplicates such that each element appear only once.

For example,
Given1->1->2, return1->2.
Given1->1->2->3->3, return1->2->3. 

class Solution {
public:ListNode *deleteDuplicates(ListNode *head) {ListNode *li = head;while(li&&li->next){while(li&&li->next&&(li->next->val == li->val))li->next = li->next->next;li = li->next;}return head;}
};

 6. remove-duplicates-from-sorted-list-ii

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given1->2->3->3->4->4->5, return1->2->5.
Given1->1->1->2->3, return2->3.

分析:这里创建了一个新的头节点,作为第一个不重复的节点;

class Solution {
public:ListNode *deleteDuplicates(ListNode *head) {if((!head)||(!head->next))return head;ListNode *newHead = new ListNode(head->val-1);newHead->next = head;ListNode *last = newHead;ListNode *cur = head;while(cur&&cur->next){if(cur->val!=cur->next->val){last = cur;}else{while(cur&&cur->next&&(cur->val==cur->next->val)){cur = cur->next;}last->next = cur->next;}cur = cur->next;}return newHead->next;}
};

 

转载于:https://www.cnblogs.com/xctcherry/p/8515142.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux进程管理之mm_struct,【转】Linux进程管理之SMP负载平衡(续二)

继续来分析balance_tasks()函数,结合代码中的注释,理解这段代码应该很容易,在这里主要分析它的两个重要的子函数,即can_migrate_task()和pull_task().先来看can_migrate_task().该函数用来判断当前进程是否能够迁移到目标cpu上,代码如下:staticint can_migrate_task(struct tas…

分治法求最大最小

分治法的基本思想&#xff1a;是将一个规模为n的原问题分解为k个规模较小的子问题&#xff0c;这些子问题互相独立且与原问题相同。递归地解这些子问题&#xff0c;然后将子问题的解合并为原问题的解。 1 #include<stdio.h>2 /* 分治法计算最大值和最小值的算法程序&…

linux安装程序乱码,linux远程桌面乱码解决及引起的相关问题、字库安装

一、解决linux中文乱码问题通过xmanager远程访问linux(我这里使用redhat as5)&#xff0c;原先本机可以看到的中文出现乱码(ssh终端访问时也是乱码)。如何解决这一问题&#xff1f;其实&#xff0c;很简单只要设置系统字符集就行。具体如下&#xff1a;1、修改/etc/sysconfig/i…

第12课第2.2节 字符设备驱动程序之LED驱动程序_测试改进

第12课第2.2节 字符设备驱动程序之LED驱动程序_测试改进 //仅用flash上的根文件系统启动后&#xff0c;手工MOUNT NFSmount -t nfs -o nolock,vers2 192.168.31.202:/work/nfs_root /mnt //在虚拟机中操作/work/nfs_root/tmp$ sudo chown book:book fs_mini_mdev -R //修改为可…

linux查看目录下文件个球,球服务翻译……只找到以前版本的。新版的服务名称改了……...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼还是优化的问题……看得懂地我就关了。比如蓝牙什么的……5985ms fedora-storage-init.service4451ms colord-sane.service3578ms udev-settle.service1545ms NetworkManager.service1492ms boot.mount1443ms systemd-vconsole-set…

大数据笔记(十三)——常见的NoSQL数据库之HBase数据库(A)

一.HBase的表结构和体系结构 1.HBase的表结构 把所有的数据存到一张表中。通过牺牲表空间&#xff0c;换取良好的性能。 HBase的列以列族的形式存在。每一个列族包括若干列 2.HBase的体系结构 主从结构&#xff1a; 主节点&#xff1a;HBase 从节点&#xff1a;RegionServer 包…

linux内核网络钩子函数使用,Linux内核IOCTL网络控制框架实现实例分析

4.6、inet_ioctl函数由于inet_ioctl函数内容分支很多,但功能、处理不难理解,所以我把一些不常见的内容都省去,挑简单重要的说,完全在于抛砖引玉:static int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg){…switch(cmd){case FIOSETOWN://设置属主cas…

(转)递归转非递归的思路和例子

转自&#xff1a;http://blog.51cto.com/cnn237111/1241956 某些算法逻辑&#xff0c;用递归很好表述&#xff0c;程序也很好写。理论上所有的递归都是可以转换成非递归的。如果有些场合要求不得使用递归&#xff0c;那就只好改成非递归了。 通常改成非递归算法的思路&#xff…

Linux自动亮度,ubuntu亮度无法自动调节终极解决方案

关于ubuntu亮度无法自动调节的问题&#xff0c;纠结了我快两年&#xff0c;主要是自己懒&#xff0c;写了个脚本来调节亮度&#xff0c;不过还是稍显不便。近日兴起折腾了一番&#xff0c;终于找到问题根结了。There are many ways to control brightness. According to this d…

NHibernate:no persister for 异常

几种原因&#xff1a; 1、配置文件后缀名写错 mapping file 必须是.hbm.xml结尾 2、Web.config配置里面引用实体 <session-factory> ........................ <mapping assembly"Project.DomainModel"/> <!-- Here --> </session-factory>…

拦截器的的调用顺序

拦截器的的调用顺序 a&#xff1a;首先&#xff0c;要找到它自己有没有声明拦截器的引用&#xff0c;即<action>元素有没有<interceptor-ref>子元素&#xff0c;如果有&#xff0c;则不用继续寻找&#xff08;即不会再使用b,c即默认的拦截器栈等&#xff09;&#…

嵌入式linux 试卷,嵌入式Linux模拟试卷

B. 在目标机上开发&#xff0c;在宿主机上运行C. 在宿主机上开发&#xff0c;在宿主机上运行D. 在目标机上开发&#xff0c;在目标机上运行10. ARM9寄存器组有______个寄存器。【2.0分】A. 7B. 32C. 6D. 3711. 以下叙述中&#xff0c;不符合RICS特征的是______。【2.0分】A. 指…

iOS - 富文本

iOS--NSAttributedString超全属性详解及应用&#xff08;富文本、图文混排&#xff09; ios项目中经常需要显示一些带有特殊样式的文本&#xff0c;比如说带有下划线、删除线、斜体、空心字体、背景色、阴影以及图文混排&#xff08;一种文字中夹杂图片的显示效果&#xff09;。…

运维工程师必会的linux命令下载,运维工程师必会的109个Linux命令.pdf

Linux公社运维工程师必会的109 个Linux 命令版本 1.0崔存新目录1 文件管理 51.1 basename 51.2 cat 51.3 cd 61.4 chgrp 61.5 chmod 71.6 chown 81.7 comm 91.8 cp91.9 cut 101.10 dd 111.11 diff 121.12 dir 131.13 dos2unix 151.14 egrep 161.15 fgrep 161.16 file 161.17 fi…

pdf.js 文字丢失问题 .cmaps

使用pdf.js 展示pdf文件 需求&#xff1a;电子发票类的pdf文件&#xff0c;以base64流的形式请求到&#xff0c;在浏览器中展示pdf文件 遇到的问题&#xff1a; 正常展示后&#xff0c;部分文字无法正常显示&#xff0c; 正常显示如下&#xff1a; 文件目录&#xff1a; js:fun…

linux红黑树节点没有数据,真正理解红黑树,真正的(Linux内核里大量用到的数据 -电脑资料...

作为一种数据结构&#xff0c;红黑树可谓不算朴素&#xff0c;因为各种宣传让它过于神秘&#xff0c;网上搜罗了一大堆的关于红黑树的文章&#xff0c;不外乎千篇一律&#xff0c;介绍概念&#xff0c;分析性能&#xff0c;贴上代码&#xff0c;然后给上罪恶的一句话&#xff0…

bzoj3631: [JLOI2014]松鼠的新家

容易发现是树剖裸题。 然后毒瘤选手AKC表示好像可以用树上差分LCA做。 就这样。水题。 诶那你咋没秒切。 妈也看错样例&#xff0c;然后画错图&#xff0c;接着就是理解错题目&#xff0c;最后R成傻逼之时发现我ST表开数组的顺序错了。。。 废物。 #include<cstdio> #inc…

超过4g的文件怎么上传到linux,怎么免费上传大于4G的文件到百度云 大于4G的文件不开会员怎么上传到百度云...

4G管家appv1.0 安卓版类型&#xff1a;系统工具大小&#xff1a;13.1M语言&#xff1a;中文 评分&#xff1a;10.0标签&#xff1a;立即下载百度云可以非常方便大家存储一些大文件资料&#xff0c;而且百度云的容量也非常高&#xff0c;不过如果你是普通用户的话要想上传大于4g…

scanf和printf在c语言中的作用,C语言中的scanf与printf

最初学习C语言程序设计时&#xff0c;经常需要通过键盘交互方式请用户输入内容&#xff0c;并需要将用户计算的结果在屏幕上输出。为实现这样的操作&#xff0c;C语言提供了scanf与printf两个函数&#xff0c;使用它们之前&#xff0c;一般需要包含stdio.h头文件。语法是&#…

linux sed 循环多行,linux sed 多行处理详细总结

在正常情况下&#xff0c;sed将待处理的行读入模式空间&#xff0c;脚本中的命令就一条接着一条的对该行进行处理&#xff0c;直到脚本执行完毕&#xff0c;然后该行被输出&#xff0c;模式空间请空&#xff1b;然后重复刚才的动作&#xff0c;文件中的新的一行被读入&#xff…