21.LeetCode - 合并两个有序链表:解题思路清晰

102 阅读2分钟

前言

你好, 我是Cici。数据结构和算法属于我们技术人员的内功,不管技术怎么更新,它始终都是不变的。无论是出于笔试面试需求,还是个人兴趣爱好,算法题都是值得我们去研究的。 我个人认为想要真正做好一道题目,首先最重要的一件事是 “读懂题目,提取关键信息”,这样思路才能更加清晰。第二件事就是在编写代码时要多结合框架思维,什么是框架?说白了就是某一类题型的解题模板,利用框架(利用模板)从整体到细节、从抽象到具体的来解决问题,用这样的思维学习其他知识时也是通用的。

一、题目分析

原题链接:21. 合并两个有序链表

观察题目,我们可以得到的关键信息有:

  • 两个链表都是非递减的
  • 创建了新的链表,该链表升序

二、思路

由关键信息,既然要创建新的链表,那么就可以采用虚拟头结点,结合双指针来解决问题。 通常来讲,当我们需要创造一条新链表的时,就可以使用虚拟头结点简化边界情况的处理。

  • 新建两个指针,分别指向两个链表的头部
  • 比较两个指针指向的节点大小,将值较小的节点接到虚拟头结点

三、参考代码

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        // 虚拟头节点
        ListNode mhead = new ListNode(-1);
        ListNode temp = mhead;
        ListNode l1 = list1;
        ListNode l2 = list2;
        
        while(l1 != null && l2 != null){
            if(l1.val > l2.val){
                temp.next = l2;
                l2 = l2.next;
            }else{
                temp.next = l1;
                l1 = l1.next;
            }
            // 辅助指针前进
            temp = temp.next;
        }

        temp.next = l1 == null ? l2 : l1;
        return mhead.next;
    }
}

四、最后

放平心态,努力学习,认真工作,做自己该做的事情,努力实现自己的目标

您的点赞收藏是对我最大的鼓励! 如果大家有什么疑问,欢迎在评论区一起讨论!