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


theme: smartblue

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

合并两个有序链表

LeetCode刷题记录(二十五):合并两个有序链表_第1张图片

题目解析

题目素材解析

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

  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; } }

执行结果

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

LeetCode刷题记录(二十五):合并两个有序链表_第2张图片

Java代码本地执行

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

如下图所示:

LeetCode刷题记录(二十五):合并两个有序链表_第3张图片

你可能感兴趣的:(leetcode,链表,算法,职场和发展,数据结构)