public class MergeTwoSortedLists {
//方法一:迭代法
public ListNode mergeTwoLists1(ListNode l1, ListNode l2) {
//首先定义一个哨兵节点,它的next指向最终结果的头节点
ListNode sentinel = new ListNode(-1);
//保存当前结果链表里的最后一个节点作为判断比较的前一个节点
ListNode prev = sentinel;
//迭代遍历两个链表 ,直到至少有一个null
while (l1!=null&&l2!=null){
//比较当前两个链表头结点,较小的哪个链接在链表末尾
if(l1.val<=l2.val){
prev.next = l1;//当l1头结点连接到prev后面
prev = l1;//指针向前移动,以下一个节点作为链表头结点
l1 = l1.next;
}else{
prev.next = l2;//当l2头结点连接到prev后面
prev = l2;//指针向前移动,以下一个节点作为链表头结点
l2 = l2.next;
}
}
//循环结束,最多还有一个链表没有遍历完成,因为已经排序了,可以直接把剩余节点接到结果链表上
prev.next = (l1==null)?l2:l1;
return sentinel.next;
}
//方法二:递归
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//基准情况
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
//比较头结点
if(l1.val<=l2.val){
//l1头结点要小,直接提取出来,剩下的l1和l2继续合并,接在l1的后面
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}else {
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
public static void main(String[] args) {
MergeTwoSortedLists mergeTwoSortedLists = new MergeTwoSortedLists();
ListNode listNode11 = new ListNode(1);
ListNode listNode12 = new ListNode(2);
ListNode listNode13 = new ListNode(4);
listNode11.next = listNode12;
listNode12.next = listNode13;
listNode13.next = null;
ListNode listNode21 = new ListNode(1);
ListNode listNode22 = new ListNode(3);
ListNode listNode23 = new ListNode(4);
listNode21.next = listNode22;
listNode22.next = listNode23;
listNode23.next = null;
ListNode listNode = mergeTwoSortedLists.mergeTwoLists(listNode11, listNode21);
TestLinkedList.printList(listNode);
}
}