LeetCode21:合并两个有序链表
一、解题思路
该题能有两种解题思路
1、思路1
可以模拟两个数组的合并,就是归并排序,比较第一个的大小,将小的放到结果链表中,然后接着比较,直到两个链表全部比较结束
如果有一个链表为空,就直接把另一个链表的剩余元素全部加到结果链表中即可,然后退出循环,具体步骤如图所示
2、思路2
第二种解法其实主要的实现方式和上述的也一样,只不过是实现的方式不一致,第一种方法需要新开辟一个空间,用于存放结果。
其实在每步骤的操作都是一样的,将首位相比较,小的链接到下一个元素上,所以就可以采用递归的方法,具体如图所示
二、代码实现
1、方法1
public ListNode mergeTwoLists2(ListNode list1, ListNode list2) {
ListNode list3 = new ListNode();
ListNode ptr1 = list1;
ListNode ptr2 = list2;
ListNode ptr3 = list3;
while(true) {
if (ptr1.next == null) {
ptr3.next = ptr2;
break;
}
if (ptr2.next == null) {
ptr3.next = ptr2;
break;
}
if (list1.val < list2.val) {
ptr3.next = ptr1;
ptr3 = ptr3.next;
ptr1 = ptr1.next;
} else {
ptr3.next = ptr2;
ptr3 = ptr3.next;
ptr2 = ptr2.next;
}
}
return list3;
}
2、方法2
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
} else if (l2 == null) {
return l1;
} else if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}