算法(链表)--合并两个有序链表

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

示例:

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

解法1:暴力解法:因为l1和l2两个链表是升序排列顺序已经固定了的,一个指针指向l1的head,一个指针指向l2的头指针,如果l1.val 代码设计如下:
ListNode类

package com.cxy.linkedtable;


/**
 * 结点类
 */
public class ListNode {
  int val;
  //指向结点指针
  ListNode next;
  //
  public ListNode(int val){
    this.val = val;
  }
  public ListNode(int currData,ListNode next){
    this.val = currData;
    this.next = next;
  }
  public ListNode(){}

  @Override
  public String toString() {
    ListNode head = this;
    StringBuilder s = new StringBuilder();
    while (head != null){
      s.append(head.val+ " ");
      head = head.next;
    }
    return s.toString();
  }
}

逻辑实现类

package com.cxy.linkedtable;

import javax.swing.*;

public class MergTwoLTable {
  public ListNode mergeTwoLists(ListNode l1,ListNode l2){
    //创建一个哑结点()
    ListNode dummp = new ListNode(-1);
    ListNode curr = dummp;
    if(l1 == null){return l2;}
    if(l2 == null){return l1;}
    while(l1 != null && l2 != null){
      if(l1.val < l2.val){
        curr.next = new ListNode(l1.val);
        //移动l1,指向下一个结点
        l1 = l1.next;
      }else {
        curr.next = new ListNode(l2.val);
        l2 = l2.next;
      }
      //移动当前指针到下一个结点
      curr = curr.next;
    }
    if(l1 == null){curr.next = l2;}
    if(l2 == null){curr.next = l1;}
    return dummp.next;
  }

  public static void main(String[] args) {
    MergTwoLTable lTable = new MergTwoLTable();
    ListNode l1 = new ListNode(1);
    l1.next = new ListNode(2);
    l1.next.next = new ListNode(4);
    ListNode l2 = new ListNode(1);
    l2.next = new ListNode(3);
    l2.next.next = new ListNode(4);
    ListNode node = lTable.mergeTwoLists(l1, l2);
    System.out.println(node.toString());
  }
}

本题采用暴力解法,效率不是很高,听官方讲可以采用递归,具体代码可以参考下面代码
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(算法(链表)--合并两个有序链表)