您的位置:首页 > 职场人生

leetcode面试题25. 合并两个排序的链表

2020-03-31 19:32 761 查看

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解题过程:
感觉有点像归并排序的merge的过程,就试着写写,结果就做出来了!

class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null&&l2==null){
return null;
}
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
ListNode node1=l1;
ListNode node2=l2;
ListNode root;
if(node1.val<=node2.val){
root = new ListNode(node1.val);
node1 = node1.next;
}else{
root = new ListNode(node2.val);
node2=node2.next;
}
ListNode node = root;
while(node1!=null&&node2!=null){
if(node1.val<=node2.val){
node.next = new ListNode(node1.val);
node1 = node1.next;
node = node.next;
}else{
node.next = new ListNode(node2.val);
node2=node2.next;
node = node.next;
}
}
while(node1!=null){
node.next = new ListNode(node1.val);
node1 = node1.next;
node = node.next;
}
while(node2!=null){
node.next = new ListNode(node2.val);
node2 = node2.next;
node = node.next;
}
return root;
}
}

然后就去看大佬的答案嘛,发现果然我写的有点啰嗦,可以优化,哎,我何时才能和他们一样厉害!
优化后的代码:

class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null&&l2==null){
return null;
}
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
ListNode head = new ListNode(-1);
ListNode cur = head;
while(l1!=null&&l2!=null){
if(l1.val<=l2.val){
cur.next = l1;
l1 = l1.next;
}else{
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
if(l1!=null){
cur.next = l1;
}
if(l2!=null){
cur.next = l2;
}
return head.next;
}
}

最大优化的地方就是它使用了一个伪头节点,这个概念以前碰到过,但是没想起来。。。。得记住一下!还有就是最后两个while它换成了if,对,这个确实可以哎。。
另外还有一种递归更简单:

class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null)
return l2;
if (l2 == null)
return l1;
if(l1.val<l2.val){
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}else{
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
海贼路飞王 发布了10 篇原创文章 · 获赞 0 · 访问量 127 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: