本题难度:
简单
本题思路:
由于题目所给链表结点定义当中并没有关于头结点的描述,可以知道参数是两个未设置头结点的有序链表,那么为了方便编写代码,可以自己给结果链表定义一个空的头结点,然后用一个工作指针不断查找待排序的两个有序链表当中值较小的链表结点并将其插入结果链表表尾,不断将工作指针往后移动,同时指向头结点的指针是不能移动的,合并完之后,若有链表结点剩余,直接插到结果链表尾即可,由于所给链表末尾指针本来就是置空的,所以也省去了手动给结果链表表尾置空的操作。
本题代码:
/**
* 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 headPointer = new ListNode(-1);
ListNode tempPointer = headPointer;
while(list1 != null && list2 != null){
if(list1.val <= list2.val){
tempPointer.next = list1;
list1 = list1.next;
}
else{
tempPointer.next = list2;
list2 = list2.next;
}
tempPointer = tempPointer.next;
}
if(list1 != null)
tempPointer.next = list1;
if(list2 != null)
tempPointer.next = list2;
return headPointer.next;
}
}
本题复杂度:
时间复杂度T(n)=O(m+n)——只要遍历两个有序链表
空间复杂度S(n)=O(1)——只要多设置一个空的头结点