合并链表 leetcode21

合并链表

//20220324
写在前面:这几天在复习算法,今天写到合并链表,发现自己突然没了思路,看答案发现很巧妙,在此记录一下

问题描述

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

解决思路:

  • 递归:直接把问题分解,传送下一层,使用递归实现从最后一个结点开始合并
  • 迭代:设置一个头结点,然后遍历两个链表,一个一个接上链表结点

代码实现;

  • 递归
/**
 * 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 list1, ListNode list2) {
        if(list1==null){
            return list2;
        }
        if(list2==null){
            return list1;
        }

        if(list1.val>list2.val){
            list2.next = mergeTwoLists(list2.next,list1);
        }else{
            list1.next = mergeTwoLists(list1.next,list2);
        }
        return list1.val>list2.val?list2:list1;
    }
}

  • 迭代
/**
 * 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 list1, ListNode list2) {
        if(list1==null){
            return list2;
        }
        if(list2==null){
            return list1;
        }

        ListNode prevHead = new ListNode(-1);
        ListNode prev = prevHead;

        while(list1!=null&&list2!=null){
            if(list1.val>list2.val){
                prev.next = list2;
                list2 = list2.next;
            }else{
                prev.next = list1;
                list1 = list1.next;
            }
            prev = prev.next;
        }
        prev.next = list1==null?list2:list1;
        return prevHead.next;
    }
}

希望对后来者有所帮助
以上
/抱拳

posted @ 2022-03-24 15:17  醉生梦死_0423  阅读(17)  评论(0编辑  收藏  举报