继续打卡算法题,今天学习的是LeetCode的第21题合并两个有序链表,这道题目是道简单题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些帮助。
分析一波题目
看完题目,很容易想到构建一个新链表,然后每次遍历两个链表并找一个最小的节点作为新链表的节点,直到两个链表都遍历到了尾。这样需要记录两个链表遍历到的指针,这样会涉及到多个指针的变化,非常复杂了。
如果我们使用递归就可以避免这种多个指针的控制,只要控制递归结束条件就可以。
但是递归思想真的是非常不好讲清楚!!直接上代码
编码解决
/**
* 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 l1, ListNode l2) {
//l1到达了尾部
if (l1 == null) {
return l2;
}
//l2到达了尾部
else if (l2 == null) {
return l1;
}
//节点判断 l1作为头节点
else if (l1.val < l2.val) {
//找l1的下一个节点
l1.next = mergeTwoLists(l1.next, l2);
//返回l1,成为上一个节点的next
return l1;
}
//节点判断 l2作为头节点
else {
//重新找l2的下一个节点
l2.next = mergeTwoLists(l1, l2.next);
//返回l2,成为上一个节点的next
return l2;
}
}
}
总结
递归对于解决嵌套循环多次的情况比较巧妙,但是递归很难讲清楚,我们可以举简单的数据例子,套入递归代码,这样就容易理解。