问题描述来源leetcode
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2: 输入:l1 = [], l2 = [] 输出:[]
示例 3: 输入:l1 = [], l2 = [0] 输出:[0]
提示: 两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列
一、题解
public class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if (list1 == null) return list2;
if (list2 == null) return list1;
ListNode current = null;
ListNode pre = null;
if (list1.val > list2.val){
current = list1;
list1 = list2;
list2 = current;
}
current = list1;
while (current.next != null){
pre = current;
current = current.next;
if (current.val > list2.val){
pre.next = list2;
list2 = current;
current = pre;
}
}
current.next = list2;
return list1;
}
}
整体思路:将一个链表作为参照系(这里使用list1作为参照系);这个链表上进行不断遍历下一个节点的操作;如果这个链表的当前节点大于另一个链表的头节点,那么就要调换list1和list2了,这里调换肯定要使用到前驱节点,但是因为这里是单链表,于是要是有双指针(list1的前驱节点指针为pre,当前节点为current)。
边界条件:当current.next为null时说明已经遍历到list1的末尾了,但是对于list2有可能还有比current.val大的节点,于是就要将当前节点的下有一个指针指向list2
这里本来就没什么特别复杂的内容,主要是考虑循环遍历时考虑时将current还是current.next等于null作为判断条件,另外还要考虑边界条件。