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

最近在温习数据结构的时候,遇到这个习题,记录一下思路。

1.两个链表都是有序列表  。而且新链表都是使用的给定的两个链表的所有节点,所以我们可以创建一个新链表,后面的节点指向原链表的节点

2.分析单链表的数据结构 它是用指针标识数据之间的逻辑关系(数据域和指针域)(指针域存放下一节点的地址)。

设计思路:

创建一个头节点,并且创建一个新ListNode链表方便进行后续操作

2.先判断 给定的单链表是否为空;若不为空,将给定的两个链表的数据域的进行比对  如果L1单链表的值比较小,则将来新链表的next域指向L1此时指向的节点,同时要将原链表指向下一个节点;反之,将新链表的next域指向L2此时指向的节点,并且将原链表指向下一个节点。如果L1的下一节点为空,则直接将L2放入新链表中

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode listNode=new ListNode(0);
        ListNode cur=listNode;
        while(l1!=null&& l2!=null)
        {
            if(l1.val<=l2.val){
                cur.next=l1;
                cur=cur.next;
                l1=l1.next;
            }else{
                 cur.next=l2;
                cur=cur.next;
                l2=l2.next;
            } 
        }
        
        if(l1==null){
            cur.next=l2;
        }
        if(l2==null){
            cur.next=l1;
        }
        return  cur.next;
    }
}

其实,我们还可以使用递归实现:

我们可以如下递归地定义在两个链表里的合并 操作(忽略边界情况,比如空链表等):


当L1.val<L2.val时候,    list1[0]+merge(list1[1:],list2)
当L1.val>=L2.val时候 ,      list2[0]+merge(list1,list2[1:])   
​    
  
​    

也就是说,两个链表头部较小的一个与剩下元素的 merge 操作结果合并。

扫描二维码关注公众号,回复: 11310882 查看本文章
 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;
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_37950333/article/details/103687535