AcWing34:合并两个排序的链表

Posted 劭兮劭兮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing34:合并两个排序的链表相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

问题

原题链接:合并两个排序的链表
在这里插入图片描述
在这里插入图片描述

解决办法

(二路归并) O(n)

  • 新建虚拟头结点dummy,设置current指针指向dummy,current 指针负责记录当前已经确定位置的元素;
  • 若当前 current1 指针指向的结点的值val比 current2 指针指向的结点的值val小,则令 current 的next指针指向 current1,且 current1 后移;
    注意:current 的位置也需要后移;因为目前又有一位结点的位置已经确定;

在这里插入图片描述

  • 否则指向 current2 ,且 current2 后移。
    注意:current 的位置也需要后移;因为目前又有一位结点的位置已经确定;

在这里插入图片描述

  • 循环到 current1 为空,或者 current2 为空
    在这里插入图片描述
  • 如果 current1 为空,则将 current.next = current2;如果 current2 为空,则将 current.next = current1;
  • 最终结果图
    在这里插入图片描述

JAVA代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode merge(ListNode l1, ListNode l2) {
        if(l1 == null) {
        	return l2;
        }
        if(l2 == null) {
        	return l1;
        }
        
//        创建虚拟头结点
        ListNode dummy = new ListNode(0);
//        用来记录当前指针
        ListNode current = dummy;
        ListNode current1 = l1;
        ListNode current2 = l2;
        
        while(current1 != null && current2 != null) {
        	if(current1.val <= current2.val) {
        		current.next = current1;
        		current1 = current1.next;
        	}else {
        		current.next = current2;
        		current2 = current2.next;
        	}
        	
//        	current需要继续往下移动
        	current = current.next;
        }
        
        if(current1 == null) {
        	current.next = current2;
        }else {
        	current.next = current1;
        }
        
        return dummy.next;
    }
}

小记:
原题链接:合并两个排序的链表

以上是关于AcWing34:合并两个排序的链表的主要内容,如果未能解决你的问题,请参考以下文章

AcWing34:合并两个排序的链表

JZ-016-合并两个排序的链表

《剑指Offer——合并两个排序的链表,两个链表的第一个公共节点》代码

代码的鲁棒性:合并两个排序的链表

《剑指Offer》题目:合并两个排序的链表

最强解析面试题:合并两个排序的链表