题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
思路:把链表2的元素插入到链表1。通过比较val的值来插入。
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 分别为两个链表创建头节点,变成新链表
ListNode list1 = new ListNode(0,l1);
ListNode list2 = new ListNode(0,l2);
// 我选择链表2 插到 链表1
// 有可能链表2的元素会小于链表1的第一个,所以temp1这个节点从头节点开始
// temp2从原链表的第一个开始
ListNode temp1 = list1;
ListNode temp2 = list2.next;
// 两者不为空 就一直遍历,
// 由于temp1是要被插入的,如果直接用temp1!=null来判断会造成前面的节点丢失
while(temp1.next != null&& temp2!=null){
// 如果temp1下一个节点的val值大于等于temp2的当前节点val值,我们就认为我们找到了要插入的位置
// 好比 把2插入到1,3,如果是判断temp1.val>=temp2.val。那插入的时候就无法进行了。
// 3大于2 由于是单链表,所以我们无法获取到1让1指向2。如果用temp1.next.val就能避免这个问题
if(temp1.next.val >= temp2.val){
// 节点的插入 要用中间变量存储
// 同时由于temp2被取走了 所以我们用变量存储temp2的next,否则找不到了
ListNode temp3 = temp1.next;
ListNode temp4 = temp2.next;
temp1.next = temp2;
temp2.next = temp3;
temp2 = temp4;
}else {//如果temp1.next是小于temp.val我们让temp1接着往下走就行
temp1 = temp1.next;
}
}
// 如果temp2不为空,说明temp2剩下的元素都比temp1的最大元素还大
// 这里其实还有其余两种情况,分别是 temp1空,temp2空以及temp2空,temp1不空
// 但是这两种情况都说明已经插入完毕了。因为temp2已经为空了。
if(temp2!=null){
temp1.next = temp2;
}
// 最后去掉头节点
ListNode result = list1.next;
return result;
}
因为两个链表都只遍历一次,所以时间复杂度为O(n);