【leetCode】21. 合并两个有序链表【链表】

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

示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
通过次数283,241提交次数451,760
  • 链表 Java的一些写法
  • listnode表示当前链表的头节点 也可表示整个链表
  • ListNode.next 表示下一个节点的地址 ListNode.val 表示当前节点的指
  • if(ListNode==null)判断此链表是否为空
  • ListNode dummyhead=new ListNode(0); 新建一个节点
  • 不能用头节点去遍历 而是要新建一个节点 用此节点去遍历

暴力法 O(m+n)

/**
 * 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 l1, ListNode l2) {

        ListNode dummyhead=new ListNode(0);
        ListNode res=dummyhead;

        //if(l1==null) return l2;
        //if(l2==null) return l1; 由后面可知此处判断不需要
     

        while(l1!=null&&l2!=null){
            if(l1.val<l2.val){
                res.next=l1;
                res=res.next;
                l1=l1.next;
            }
            else{
                res.next=l2;
                res=res.next;
                l2=l2.next;
            }
        }
        if(l1==null)
        res.next=l2.next;
        else res.next=l1.next;

        return dummyhead.next;
    }
}

递归法 o(m+n)

/**
 * 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 l1, ListNode l2) {

        if(l1==null){
            return l2;
        }
        else if(l2==null){
            return l1;
        }
        else if(l1.val<l2.val){
            l1.next=mergeTwoLists(l1.next,l2);
            return l1;
        }
        else{
            l2.next=mergeTwoLists(l1,l2.next);
            return l2;
        }
    }
}

其实递归就是程序内部维护了一个栈。这个题就是每次都把最小值压入栈,最后出栈的时候,将所有数连在一起就可以了。说白了,就是用一个栈维护了顺序。最后的连接,当然是小的连小的,所以l1 小,就连到 l1,l2 小就连到 l2,最后先返回的,就是最小的头结点。

  1. 返回的是 l1 l2 其实返回的是l1.next l2.next
  2. 整个递归结束就返回最小的节点 也就是头节点

你可能感兴趣的:(LeetCodes刷题之路)