题解 | #合并两个排序的链表#

合并两个排序的链表

https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337

合并两个排序的链表,这道题想了2h,而且最后也没完全通过所有案例!
在怀疑着是自己刷题太少还是说自己真的太蠢了

我一开始思路是首先找到第一个值最小的链表,把他当作起点,然后这个链表和第二个链表进行连接,连接完毕就步进,进行下一次连接!
这里出现的问题还挺多的,首先就是我默认以为第二链表就是最大的,也就是没有比较值,导致一部分样例没过,应该就是没有比较值导致的,
而且我使用的是在原链表上进行连接,因此难免会比较复杂,当时没想到用一个而外的链接去记录合并的,导致很多临界条件没处理好。

看了题解之后才发现原来自己才是个菜鸡!
题解理解之后就是首先创建一个节点用来记录合并后的节点,然后创建一个哨兵的节点(其实就是用来获取记录节点的头节点),之后开始while循环
循环条件就是下一个节点值不为null,如果是null直接退出,循环体就是比较谁的值比较小,把小的放进记录节点,然后原节点步进,最后记录节点也要步进,
循环结束后因为可能会有一些节点不为null,不为null的节点就直接放到记录节点(这里要注意一个节点会有下一个节点的地址,环环相扣,因此不必当心下一个节点存在,只要记录的地址还在就行)
不为null可能就是当前节点1一直都是比节点2小。
最后的最后就是返回了,返回不是直接返回记录节点,因为此时的记录节点地址是第n个,我们只需要返回记录节点的头节点即可,因为链表是环环相扣,有头节点就能一直找到下一个节点。因此我们通过
哨兵节点将头节点返回即可。一句话,真的是太秒了,我真是太菜了~

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1ListNode list2) {
        if (list1 == null || list2 == null) {
            return list1 == null ? list2 == null ? null : list2 : list1;
        }
        ListNode list = new ListNode(0);
        ListNode result = list;
        while (list1 != null && list2 != null) {
            if (list1.val > list2.val) {
                list.next = list2;
                list2 = list2.next;
            } else {
                list.next = list1;
                list1 = list1.next;
            }
            list = list.next;
        }
        if (list1 != null) {
            list.next = list1;
        } else {
            list.next = list2;
        }
        return result.next;
    }
}


#Java开发#
全部评论

相关推荐

2024-11-26 15:41
门头沟学院 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务