博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
链表算法面试题---合并N个有序链表
阅读量:2497 次
发布时间:2019-05-11

本文共 3012 字,大约阅读时间需要 10 分钟。

题目描述

给定一个链表数组,数组中的每一个链表都是升序的,请你把数组中的所有链表按照升序的方式合并到一个链表中。

示例:

链表数组:【【0—>1】,【1—>2】,【2—>3】】

最终结果:【0—>1—>1—>2—>2—>3】

如果你有了前面的经验,那么本题暴力的方法就是遍历数组,统一看成两个链表合并的方式。

暴力解法

public class MergeMultipleLists {
public static void main(String[] args) {
MergeMultipleLists c = new MergeMultipleLists(); ListNode[] lists = new ListNode[3]; ListNode n1 = new ListNode(0); ListNode n2 = new ListNode(1); ListNode n3 = new ListNode(2); lists[0] = n1; lists[1] = n2; lists[2] = n3; System.out.println(c.mergeMultipleLists(lists)); } public ListNode mergeMultipleLists(ListNode[] lists) {
ListNode res = null; for (int i = 0; i < lists.length; i++) {
//合并两个链表 res = mergeTwoList(res, lists[i]); } return res; } private ListNode mergeTwoList(ListNode p1, ListNode p2) {
if (p1 == null) {
return p2; } if (p2 == null) {
return p1; } ListNode mergeNode = new ListNode(); ListNode pre = mergeNode; while (p1 != null && p2 != null) {
if (p1.val < p2.val) {
pre.next = p1; p1 = p1.next; } else {
pre.next = p2; p2 = p2.next; } pre = pre.next; } pre.next = p1 == null ? p2 : p1; return mergeNode.next; }}

归并的方式

暴力的方式显然不够优雅,回想一下,我们之前也遇到过了,实际上也适用于本题。

public class MergeMultipleLists {
public static void main(String[] args) {
MergeMultipleLists c = new MergeMultipleLists(); ListNode[] lists = new ListNode[0]; ListNode n1 = new ListNode(0); ListNode n2 = new ListNode(1); ListNode n3 = new ListNode(2); lists[0] = n1; lists[1] = n2; lists[2] = n3; System.out.println(c.mergeMultipleLists(lists)); } public ListNode mergeMultipleLists(ListNode[] lists) {
if(lists.length == 0){
return null; } return process(lists, 0, lists.length - 1); } private ListNode process(ListNode[] lists, int l1, int l2) {
if (l1 == l2) {
return lists[l1]; } int mid = l1 + ((l2 - l1) >> 1); ListNode p1 = process(lists, l1, mid); ListNode p2 = process(lists, mid + 1, l2); return mergeTwoList(p1, p2); } private ListNode mergeTwoList(ListNode p1, ListNode p2) {
if (p1 == null || p2 == null) {
return p1 == null ? p2 : p1; } ListNode mergeNode = new ListNode(); ListNode pre = mergeNode; while (p1 != null && p2 != null) {
if (p1.val < p2.val) {
pre.next = p1; p1 = p1.next; } else {
pre.next = p2; p2 = p2.next; } pre = pre.next; } pre.next = p1 == null ? p2 : p1; return mergeNode.next; }}

除了新增了process过程,合并过程不变。

转载地址:http://xhlrb.baihongyu.com/

你可能感兴趣的文章
web.xml 配置中classpath: 与classpath*:的区别
查看>>
suse如何修改ssh端口为2222?
查看>>
详细理解“>/dev/null 2>&1”
查看>>
suse如何创建定时任务?
查看>>
suse搭建ftp服务器方法
查看>>
centos虚拟机设置共享文件夹并通过我的电脑访问[增加smbd端口修改]
查看>>
文件拷贝(IFileOperation::CopyItem)
查看>>
MapReduce的 Speculative Execution机制
查看>>
大数据学习之路------借助HDP SANDBOX开始学习
查看>>
Hadoop基础学习:基于Hortonworks HDP
查看>>
为什么linux安装程序 都要放到/usr/local目录下
查看>>
Hive安装前扫盲之Derby和Metastore
查看>>
永久修改PATH环境变量的几种办法
查看>>
大数据学习之HDP SANDBOX开始学习
查看>>
Hive Beeline使用
查看>>
Centos6安装图形界面(hdp不需要,hdp直接从github上下载数据即可)
查看>>
CentOS7 中把yum源更换成163源
查看>>
关于yum Error: Cannot retrieve repository metadata (repomd.xml) for repository:xxxxxx.
查看>>
linux下载github中的文件
查看>>
HDP Sandbox里面git clone不了数据(HTTP request failed)【目前还没解决,所以hive的练习先暂时搁置了】
查看>>