前言
你好, 我是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;
}
}
四、最后
放平心态,努力学习,认真工作,做自己该做的事情,努力实现自己的目标
您的点赞收藏是对我最大的鼓励! 如果大家有什么疑问,欢迎在评论区一起讨论!