合并两个有序链表
我的解答:
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
ListNode head, cur;
if(list1.val<=list2.val){
head=list1;
list1=list1.next;
}
else{
head=list2;
list2=list2.next;
}
cur=head;
while(list1!=null&&list2!=null){
if(list1.val<=list2.val){
cur.next=list1;
list1=list1.next;
}
else{
cur.next=list2;
list2=list2.next;
}
cur=cur.next;
}
if(list1==null){
cur.next=list2;
}
else{
cur.next=list1;
}
return head;
}
分析:代码的时间复杂度为O(n),空间复杂度为O(1)。解题思路:比较两个链表当前节点,谁当前节点的值小就让新链表的末尾节点连接谁,然后新链表和节点值更小的链表均向后移动一步,重复此过程,直到两个链表任意一个遍历到null,最后将另一个未遍历到空的链表剩余节点连接到新链表的末尾即可。
看了官方题解后的解答:
//方法一:递归
//时间复杂度:O(n+m)
//空间复杂度:O(n+m)
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
if(list1.val<list2.val){
list1.next = mergeTwoLists(list1.next,list2);
return list1;
}
else{
list2.next = mergeTwoLists(list1,list2.next);
return list2;
}
}
//方法二:迭代
//时间复杂度:O(n+m)
//空间复杂度:O(1)
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode prehead = new ListNode(-1);
ListNode prev = prehead;
while(list1!=null&&list2!=null){
if(list1.val<=list2.val){
prev.next=list1;
list1=list1.next;
}
else{
prev.next=list2;
list2=list2.next;
}
prev=prev.next;
}
prev.next = list1==null ? list2 : list1;
return prehead.next;
}
分析:
1、方法一采用递归,每次递归返回当前两个节点中值更小的那个节点,直到某一个链表遍历到null为止。
2、方法二采用迭代,先new一个哨兵节点,方便最后答案的返回,每次比较两个链表的头节点,将值更小的那个头节点连接到新节点末尾,直到某个节点遍历到null位置,最后将未遍历到null的节点连接到新节点之后返回即可。
3、我的解题思路与官方题解的方法二一致,只不过我没有哨兵节点,而是在一开始单独比较两个链表头节点值的大小,确定出新链表的头节点。
总结
- 本题较为简单,只需要不断比较两个链表头节点值的大小,并将值更小的节点连接到新链表的末尾即可。