合并两个排序的链表
合并两个排序的链表是一个经典的算法问题。
问题描述
将两个升序排列的链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
思路分析
我们可以使用迭代的方法来解决这个问题:
- 创建哑节点:创建一个哑节点(dummy node)作为新链表的起始点,这样可以简化边界情况的处理
- 双指针遍历:使用两个指针分别遍历两个链表
- 比较并连接:比较两个指针当前节点的值,将较小的节点连接到新链表中
- 处理剩余节点:当其中一个链表遍历完后,将另一个链表的剩余部分直接连接到新链表的末尾
代码实现
链表节点定义
class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;}
}
方法一:迭代法
public class MergeSortedLists {/*** 迭代法合并两个有序链表* 时间复杂度:O(m+n),空间复杂度:O(1)*/public ListNode mergeTwoLists(ListNode list1, ListNode list2) {// 创建哑节点,简化边界处理ListNode dummy = new ListNode(-1);ListNode current = dummy;// 同时遍历两个链表while (list1 != null && list2 != null) {if (list1.val <= list2.val) {current.next = list1;list1 = list1.next;} else {current.next = list2;list2 = list2.next;}current = current.next;}// 连接剩余部分current.next = (list1 != null) ? list1 : list2;return dummy.next;}
}
方法二:递归法
public class MergeSortedLists {/*** 递归法合并两个有序链表* 时间复杂度:O(m+n),空间复杂度:O(m+n) - 递归栈空间*/public ListNode mergeTwoListsRecursive(ListNode list1, ListNode list2) {// 基准情况if (list1 == null) {return list2;}if (list2 == null) {return list1;}// 递归情况if (list1.val <= list2.val) {list1.next = mergeTwoListsRecursive(list1.next, list2);return list1;} else {list2.next = mergeTwoListsRecursive(list1, list2.next);return list2;}}
}
