一、题目要求
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
二、初步解法
2.1 初步思想
采取双指针法创建两个辅助指针ptr1,ptr2,将两个指针分置两个链表头部。
创建一个空的链表list3,创建辅助指针ptr3做合并后链表的头指针,指向list3。
遍历两个链表,将其中val小的尾插到ptr3后面,并同时将val小的指针后移,并将ptr3后移。直至其中一个链表完全遍历完成。
将没有遍历完成的链表尾插到ptr3后面。
返回新链表的next,因为新链表有头节点,要求输出不含头节点。
2.2 代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode list3 = new ListNode();
ListNode ptr1 = list1;
ListNode ptr2 = list2;
ListNode ptr3 = list3;
//两个指针未指向空节点
while(ptr1 != null && ptr2 != null){
//上链表的数值小
if(ptr1.val < ptr2.val) {
//将ptr1指向结点插入ptr3
ptr3.next = ptr1;
//ptr1后移
ptr1 = ptr1.next;
//ptr3后移
ptr3 = ptr3.next;
}
else {
//将ptr2指向结点插入ptr3
ptr3.next = ptr2 ;
//ptr2后移
ptr2 = ptr2.next;
//ptr3后移
ptr3 = ptr3.next;
}
}
// 链表1未遍历完
if(ptr1!=null){
ptr3.next=ptr1;
}
// 链表2未遍历完
if(ptr2!=null){
ptr3.next=ptr2;
}
//返回头指针后的下一个结点(头指针val为空)
return list3.next;
}
}
2.3 运行结果
空间复杂度O(1),时间复杂度O(list1.length+list2.length)。