LeetCode 8. 合并两个有序链表

题目描述

难度:简单

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

 

解题思路

对于两个有序链表l1:1->5->8l2:2->3->9,

首先将l4=l3;

利用一个while循环,遍历l1和l2,

val比较小的ListNode,则将其赋予给L3.next;直到l1和l2都遍历完成;

具体过程如下:

 

所以l4一开始指向的内存地址是一直不变的,不管l3如何变,l4还是指向一开始指向的位置,所以当l3不断往下走,

就不断往这段内存里面添加新的对象,l3一直只有一个结点,而l4指向了这段内存的头部,所以拥有多个结点

这样看来,只使用一条链表来遍历是行不通的,可能到最后只输出一个结点,用两个链表就可以解决这一问题了。

代码如下

 

public class MergeTwoLists {
     public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
         
        if (l1==null&&l2==null) {
            return null;
        }else if (l1==null) {
            return l2;
        }else if (l2==null) {
            return l1;
        }
        ListNode l3=new ListNode(l1.val<l2.val?l1.val:l2.val);
        ListNode l4=l3;
        
         if (l1.val<=l2.val) {
            l1=l1.next;
            if (l1==null) {
                l4.next=l2;
            }
        }else {
            l2=l2.next;
            if (l2==null) {
                l4.next=l1;
            }
        } 
        
        while (l1!=null&&l2!=null) {
            if (l1.val<l2.val) {
                l3.next=new ListNode(l1.val);
                l3=l3.next;
                if (l1.next!=null) {
                    l1=l1.next;
                }else {
                    l3.next=l2;
                    l3=l3.next;
                    break;
                }
            }else {
                l3.next=new ListNode(l2.val);
                l3=l3.next;
                if (l2.next!=null) {
                    l2=l2.next;
                }else {
                    l3.next=l1;
                    l3=l3.next;
                    break;
                }
            }    
        }

         return l4;

        }
     
     class ListNode {
             int val;
            ListNode next;
         ListNode(int x) { val = x; }
     }
}

 

执行结果

通过
执行用时 :1 ms, 在所有 Java 提交中击败了85.56%的用户
内存消耗 :38.6 MB, 在所有 Java 提交中击败了45.60%的用户
posted @ 2020-02-28 19:47  Transkai  阅读(153)  评论(0编辑  收藏  举报