[LeetCode]21. 合并两个有序链表(java实现)
1. 题目
2. 读题(需要重点注意的东西)
思路1:迭代,逐一比较l1的节点和l2的节点,小的加入到新的链表中,再往后走一步,再往后继续比较,直到某一方链表为null,将另一方剩余的节点全部加入到新的链表后。(类似于归并排序,容易理解但是有额外的节点开销)。
思路2:递归(理解困难但是开销较小),递归法的思想是在每次递归时,取出l1链表和l2链表中的头节点,比较大小,然后递归到next节点,直到某一条链表为空,返回另一条链表。
递归的三要素:
终止条件
每次递归的返回值—返回给上一层递归的值
在这层递归做什么
递归过程
3. 解法
解法1:迭代法
/**
* 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) {
if(l1 == null || l2 == null) return l1 == null ? l2 : l1;
ListNode tail = new ListNode(0);
ListNode cur = tail;
while(l1 != null && l2 != null){
if(l1.val < l2.val){
cur.next = l1;
l1 = l1.next;
}
else{
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
cur.next = l1 == null ? l2 : l1;
return tail.next;
}
}
解法2:递归法
/**
* 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) {
if(l1 == null || l2 == null) return l1 == null ? l2 : l1;
if(l1.val < l2.val){
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}
else{
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
}
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
6. 总结
递归法要理解从上至下执行递归,然后又从下至上返回值的两步走步骤。