题目链接:21. 合并两个有序链表【迭代+递归】
-
算法图
-
迭代思路:
(1)建立头结点
真的非常便利。
(2)执行过程中前后建立链接后,右移其对应指针!
// java 迭代
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode pre = new ListNode(-1);
ListNode cur = pre;
while(list1 != null && list2 != null) {
if(list1.val < list2.val) {
cur.next = list1;
list1 = list1.next;
} else {
cur.next = list2;
list2 = list2.next; //所有指针都要移动!
}
cur = cur.next;
}
cur.next = list1 != null ? list1 : list2;
return pre.next;
}
}
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:40.7 MB, 在所有 Java 提交中击败了81.55%的用户
// 时间复杂度:O(n+m) 空间复杂度:O(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; }
* }
*/
//java 递归
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1 == null) {
return list2;
} else if(list2 == null) {
return list1;
} else if(list1.val < list2.val) {
list1.next = mergeTwoLists(list1.next, list2);
return list1;
} else {
list2.next = mergeTwoLists(list1, list2.next);
return list2;
}
}
}
// 时间复杂度:O(n+m)
// 空间复杂度:O(n+m)