合并两个有序链表
此博客链接:https://www.cnblogs.com/ping2yingshi/p/12660142.html
合并两个有序链表(87min)
题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
题解:
思路:
1.新建一个链表。
2.比较两个链表的数,把数小的加入到新的链表中。
1)当其中一个链表为空时,直接返回另外一个链表。
2)当两个链表都不为空时,当l1中的数小于l2中的数时,把新建的链表l3指向l1,并把l1指向下一个数,同时l3也指向下一个数,当l1的中大于l2中的数,同理。
3)当一个链表先为空时,直接把l3指向另外一个链表。
注意:最后返回时,返回新建链表头的next。
超时代码:
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode l3=new ListNode(0); while(l1!=null || l2!=null){ if(l1!=null&&l2!=null){ if(l1.val < l2.val) { l3.next=l2; l2=l2.next; l3=l3.next; } } if(l1!=null&&l2!=null){ if(l2.val<l1.val) { l3.next=l1; l1=l1.next; l3=l3.next; } } if(l2==null&l1!=null) { l3.next=l1; } if(l2!=null&l1==null) { l3.next=l2; } } return l3; } }
修改判断条件后还是超时
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode l3=new ListNode(0);if(l1==null) return l2; if(l2==null) return l1; while(l1!=null && l2!=null){//修改这里 if(l1.val < l2.val) { l3.next=l2; l2=l2.next; l3=l3.next; } if(l2.val<l1.val) { l3.next=l1; l1=l1.next; l3=l3.next; } } if(l2==null&l1!=null) { l3.next=l1; } if(l2!=null&l1==null) { l3.next=l2; } return head; } }
把if后面的if改成else不超时,但是结果不对。(超时这里想到了,因为两个if中我没有判断等于情况,把其中一个if改成else 就会判断等于情况)
代码:
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode l3=new ListNode(0);if(l1==null) return l2; if(l2==null) return l1; while(l1!=null && l2!=null){ if(l1.val < l2.val) { l3.next=l2; l2=l2.next; l3=l3.next; } else//修改了这里 { l3.next=l1; l1=l1.next; l3=l3.next; } } if(l2==null&l1!=null) { l3.next=l1; } else { l3.next=l2; } return head; } }
执行结果:
发现是逻辑写错了,这里应该是谁小把谁放入l3中,修改代码,还是结果不对。
代码:
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode l3 =new ListNode(0); if(l1==null) return l2; if(l2==null) return l1; while(l1!=null && l2!=null){ if(l1.val < l2.val) { l3.next=l1;//修改了这里 l1=l1.next; l3=l3.next; } else { l3.next=l2; l2=l2.next; l3=l3.next; } } if(l2==null&l1!=null) l3.next=l1; else l3.next=l2; return l3; } }
执行结果:
这里就输出了两个数,没有全部输出。
参考类似思想代码,原来最后返回应该返回新建链表的头,修改代码:
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode head =new ListNode(0); ListNode l3=head; if(l1==null) return l2; if(l2==null) return l1; while(l1!=null && l2!=null){ if(l1.val < l2.val) { l3.next=l1; l1=l1.next; l3=l3.next; } else { l3.next=l2; l2=l2.next; l3=l3.next; } } if(l2==null&l1!=null) l3.next=l1; else l3.next=l2; return head; } }
执行结果多了一个新建链表表头的数0
在返回链表时,返回链表头结点的next,除去第一个数0.
代码如下:
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode head =new ListNode(0); ListNode l3=head; if(l1==null) return l2; if(l2==null) return l1; while(l1!=null && l2!=null){ if(l1.val < l2.val) { l3.next=l1; l1=l1.next; l3=l3.next; } else { l3.next=l2; l2=l2.next; l3=l3.next; } } if(l2==null&l1!=null) l3.next=l1; else l3.next=l2; return head.next; } }
运行结果正确:
太不容易了,终于通过了。