文章简述
大家好,本篇是个人的第 3 篇文章。
承接第一篇文章《手写单链表基础之增,删,查!附赠一道链表题》,在第一篇文章中提过,在刷算法题之前先将基础知识过一遍,这样对后面的做算法题是很有帮助的。
在本次的文章中,按照个人的刷题计划,会分享关于链表的 3 道简单级别的算法题(可是依然感觉不简单)
![](https://yx-1305006541.cos.ap-guangzhou.myqcloud.com/img/generalpicture/clipboard_20210221_091950.png)
但是不要紧,从本篇文章开始分享的算法题个人都会把关于这道题的全部代码写出来,并用debug的形式
,分解每一步来整理出来。
通过还原题目场景,用 debug 调试的方式去分析,印象更加深刻些。
![](https://yx-1305006541.cos.ap-guangzhou.myqcloud.com/img/generalpicture/clipboard_20210221_093328.png)
本篇文章中共有 3 道题目。
![](https://yx-1305006541.cos.ap-guangzhou.myqcloud.com/img/sing-linked-list-1/clipboard_20210221_042947.png)
一,合并两个有序链表
![](https://yx-1305006541.cos.ap-guangzhou.myqcloud.com/img/sing-linked-list-1/clipboard_20210221_094051.png)
1.1 题目分析
看到这道题的时候,第一反应就是先将两个链表合并,然后再排序。嗯。。。不用想,绝对的暴力写法。
或者是循环两个链表,然后两两相比较,就像:
for(){
for(){
if(){}
}
}
好吧,其实这道题精华在于可以使用递归
,这个。。。来个草图简单描述下。
第一步:
两个链表的首节点进行比较
![](https://yx-1305006541.cos.ap-guangzhou.myqcloud.com/img/sing-linked-list-1/clipboard_20210221_095828.png)
两个节点相等,则使 L2 链表【1】,和 L1 链表的【2】进行比较
注意:
L1节点【1】和L2节点【1】比较完成后,需要修改1.next指针,以指向它的下个节点。
第二步:
现在我们获取到了 L2 链表【1】,那它的 next 指向谁?也就是 L2 链表【1】去和 L1 链表的【2】进行比较。
![](https://yx-1305006541.cos.ap-guangzhou.myqcloud.com/img/sing-linked-list-1/clipboard_20210221_101410.png)
比较完成后,L2 链表【1】的 next 就指向了 L1 链表【2】,接着以此类推。
![](https://yx-1305006541.cos.ap-guangzhou.myqcloud.com/img/sing-linked-list-1/clipboard_20210221_101831.png)
L2 链表【3】去和 L1 链表【4】比较。
![](https://yx-1305006541.cos.ap-guangzhou.myqcloud.com/img/sing-linked-list-1/clipboard_20210221_102058.png)
最后 L1 链表【4】和 L2 链表【4】比较。
![](https://yx-1305006541.cos.ap-guangzhou.myqcloud.com/img/sing-linked-list-1/clipboard_20210221_102328.png)
全部比较完成后,整个链表就已经排序完成了。
![](https://yx-1305006541.cos.ap-guangzhou.myqcloud.com/img/sing-linked-list-1/clipboard_20210221_102449.png)
递归的方式就在于,两两节点进行比较,当有一个链表为null时,表示其中一个链表已经遍历完成,那就需要终止递归,并将比较结果进行返回。
可能只是单纯的画图并不好理解,下面用代码 debug 的方式去分析,还请耐心往下看。
![](https://yx-1305006541.cos.ap-guangzhou.myqcloud.com/img/generalpicture/clipboard_20210221_103012.png)
1.2 代码分析
按照题意需要先创建 2 个单链表,具体的创建方式可以参考本人的第一篇文章《手写单链表基础之增,删,查!附赠一道链表题》。不多说,先初始化节点对象。
class ListNode {
/**
* 数据域
*/
int val;
/**
* 下一个节点指针
*/
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
@Override
public String toString() {