LeetCode刷题记录(二十五):合并两个有序链表

这篇博客介绍了如何合并两个有序链表,首先处理特殊情况如链表为空,然后创建结果链表和中间值,通过循环比对两个链表的值并将较小值存入结果链表,最后利用其中一个链表结束来退出循环。代码使用Java实现,执行效率高。
摘要由CSDN通过智能技术生成

theme: smartblue

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情

合并两个有序链表

image.png

题目解析

题目素材解析

根据本道题的描述来看,是提供了两个参数。

  1. 两个正序(升序)链表。

并且题目中给出了链表的数据结构类代码。

两个链表的节点数目在0到50之间,所以这里一定要对链表参数判空处理。

我的解读

我对本道题的解读,大概有着几个重点知识要解决。

一,搞清楚链表的数据结构,并且在链表的获取下一个节点时中间值的处理。

二,特殊情况的处理,比如说链表为空时的处理。

三,如何退出链表的循环。

搞清这三点就完全可以解决这道题了。

解题思路

有了上面的思路,解答这道题就没什么难度了。

第一步,先处理特殊情况,就是两个链表可能为空的情况,如果两个都为空,则直接返回空;如果其中一个为空,则返回另外一个链表。

第二步,声明一个结果链表,和中间值。

第三步,开始循环比对,在每次循环中将较小的值存入结果中间值中,并且在结束时声明中间值的next元素。

第四步,如何结束循环呢,可以利用其中一个链表不再有下一节点的情况为终结,没有下一个节点了,则下一个节点就是另外一个链表剩下的节点了,直接赋值给中间值z即可。

代码

java /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode mergeTwoLists(ListNode list1, ListNode list2) { //特殊情况处理 if(list1 == null && list2 == null){ return null; }else if(list1 == null){ return list2; }else if(list2 == null){ return list1; } //结果值声明 ListNode result = new ListNode(); //中间值声明 ListNode z = result; //循环比对 while (true){ //对比填充值 if(list1.val <= list2.val){ z.val = list1.val; list1 = list1.next != null ? list1.next : null; }else{ z.val = list2.val; list2 = list2.next != null ? list2.next : null; } //判断是否退出循环 if(list1 == null){ z.next = list2; break; }else if(list2 == null){ z.next = list1; break; } z.next = new ListNode(); z = z.next; } return result; } }

执行结果

这道题答得还行,速度还是非常可观的。

image.png

Java代码本地执行

Java本地可调试代码,请参考github/Ijiran,可通过索引看到相应代码。

如下图所示:

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ijiran

一杯咖啡太贵,一块糖就可以

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值