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

112 阅读2分钟

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

合并两个有序链表

image.png

题目解析

题目素材解析

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

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

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

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

我的解读

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

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

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

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

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

解题思路

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

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

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

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

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

代码

/**
 * 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